@acorex-platform/module-project-management-client 0.0.21
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/fesm2022/acorex-platform-module-project-management-client-contracts.mjs +107 -0
- package/fesm2022/acorex-platform-module-project-management-client-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-project-management-client.mjs +676 -0
- package/fesm2022/acorex-platform-module-project-management-client.mjs.map +1 -0
- package/package.json +28 -0
- package/types/acorex-platform-module-project-management-client-contracts.d.ts +191 -0
- package/types/acorex-platform-module-project-management-client.d.ts +25 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/** Catalog scope for project-management workflows and related catalogs. */
|
|
2
|
+
const PM_CATALOG_SCOPE = 'project-management.pm';
|
|
3
|
+
/** Canonical entity source for {@link AXPEntityReference.type} on project subjects. */
|
|
4
|
+
const PM_PROJECT_ENTITY_SOURCE = 'ProjectManagement.Project';
|
|
5
|
+
|
|
6
|
+
const AXPProjectManagementMenuKeys = {
|
|
7
|
+
Root: 'project-management:menu',
|
|
8
|
+
Projects: 'project-management:menu:projects',
|
|
9
|
+
ProjectTypes: 'project-management:menu:project-types',
|
|
10
|
+
Tasks: 'project-management:menu:tasks',
|
|
11
|
+
TaskTypes: 'project-management:menu:task-types',
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Projects & Work capabilities used by this module.
|
|
16
|
+
* Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).
|
|
17
|
+
*/
|
|
18
|
+
const AXPProjectsWorkPermissionKeys = {
|
|
19
|
+
Access: 'ProjectsWork:Permission:Access',
|
|
20
|
+
MaintainProjects: 'ProjectsWork:Permission:MaintainProjects',
|
|
21
|
+
MaintainTasks: 'ProjectsWork:Permission:MaintainTasks',
|
|
22
|
+
ViewAllTasks: 'ProjectsWork:Permission:ViewAllTasks',
|
|
23
|
+
MaintainTimesheets: 'ProjectsWork:Permission:MaintainTimesheets',
|
|
24
|
+
ManageTimesheetActions: 'ProjectsWork:Permission:ManageTimesheetActions',
|
|
25
|
+
ViewTimesheetReports: 'ProjectsWork:Permission:ViewTimesheetReports',
|
|
26
|
+
Setup: 'ProjectsWork:Permission:Setup',
|
|
27
|
+
};
|
|
28
|
+
/** @deprecated Prefer {@link AXPProjectsWorkPermissionKeys}. */
|
|
29
|
+
const AXMPermissionsKeys = {
|
|
30
|
+
ProjectManagement: {
|
|
31
|
+
Management: AXPProjectsWorkPermissionKeys.Access,
|
|
32
|
+
Project: {
|
|
33
|
+
Management: AXPProjectsWorkPermissionKeys.MaintainProjects,
|
|
34
|
+
},
|
|
35
|
+
ProjectType: {
|
|
36
|
+
Management: AXPProjectsWorkPermissionKeys.Setup,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const config = {
|
|
42
|
+
i18n: 'project-management',
|
|
43
|
+
module: 'ProjectManagement',
|
|
44
|
+
};
|
|
45
|
+
const RootConfig = {
|
|
46
|
+
config,
|
|
47
|
+
module: {
|
|
48
|
+
module: 'ProjectManagement',
|
|
49
|
+
name: 'ProjectManagement',
|
|
50
|
+
title: `@${config.i18n}:module.title`,
|
|
51
|
+
icon: 'fa-light fa-clipboard-list-check',
|
|
52
|
+
},
|
|
53
|
+
entities: {
|
|
54
|
+
projectTypeRoleType: {
|
|
55
|
+
name: 'ProjectTypeRoleType',
|
|
56
|
+
title: '@project-management:projects.project-type-role-types.title',
|
|
57
|
+
titlePlural: '@project-management:projects.project-type-role-types.plural',
|
|
58
|
+
icon: 'fa-light fa-user',
|
|
59
|
+
},
|
|
60
|
+
projectMember: {
|
|
61
|
+
name: 'ProjectMember',
|
|
62
|
+
title: '@project-management:projects.project-members.title',
|
|
63
|
+
titlePlural: '@project-management:projects.project-members.plural',
|
|
64
|
+
icon: 'fa-light fa-users',
|
|
65
|
+
},
|
|
66
|
+
projectType: {
|
|
67
|
+
name: 'ProjectType',
|
|
68
|
+
title: `@project-management:projects.project-types.title`,
|
|
69
|
+
titlePlural: `@project-management:projects.project-types.plural`,
|
|
70
|
+
icon: 'fa-light fa-rectangle-vertical-history',
|
|
71
|
+
},
|
|
72
|
+
projectTypeCategory: {
|
|
73
|
+
name: 'ProjectTypeCategory',
|
|
74
|
+
title: '@project-management:projects.project-type-categories.title',
|
|
75
|
+
titlePlural: '@project-management:projects.project-type-categories.plural',
|
|
76
|
+
icon: 'fa-light fa-layer-group',
|
|
77
|
+
},
|
|
78
|
+
project: {
|
|
79
|
+
name: 'Project',
|
|
80
|
+
source: `${config.module}.Project`,
|
|
81
|
+
title: '@project-management:projects.terms.title',
|
|
82
|
+
titlePlural: '@project-management:projects.terms.plural',
|
|
83
|
+
icon: 'fa-light fa-square-kanban',
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
queries: {
|
|
87
|
+
dashboard: {
|
|
88
|
+
activeProjectsKpi: `${config.module}:Dashboard:ActiveProjectsKpi`,
|
|
89
|
+
projectsByStatusBar: `${config.module}:Dashboard:ProjectsByStatusBar`,
|
|
90
|
+
projectsTasksCountBar: `${config.module}:Dashboard:ProjectsTasksCountBar`,
|
|
91
|
+
customersProjectsCountBar: `${config.module}:Dashboard:CustomersProjectsCountBar`,
|
|
92
|
+
},
|
|
93
|
+
reports: {
|
|
94
|
+
getProjectsByStatus: `${config.module}:Reports:GetProjectsByStatus`,
|
|
95
|
+
getMemberWorkload: `${config.module}:Reports:GetMemberWorkload`,
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
//#region ---- Contracts barrel ----
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Generated bundle index. Do not edit.
|
|
104
|
+
*/
|
|
105
|
+
|
|
106
|
+
export { AXMPermissionsKeys, AXPProjectManagementMenuKeys, AXPProjectsWorkPermissionKeys, PM_CATALOG_SCOPE, PM_PROJECT_ENTITY_SOURCE, RootConfig };
|
|
107
|
+
//# sourceMappingURL=acorex-platform-module-project-management-client-contracts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-project-management-client-contracts.mjs","sources":["../../../../libs/modules/project-management/contracts/src/catalog-scope.keys.ts","../../../../libs/modules/project-management/contracts/src/menu.keys.ts","../../../../libs/modules/project-management/contracts/src/permission.keys.ts","../../../../libs/modules/project-management/contracts/src/root-config.ts","../../../../libs/modules/project-management/contracts/src/index.ts","../../../../libs/modules/project-management/contracts/src/acorex-platform-module-project-management-client-contracts.ts"],"sourcesContent":["/** Catalog scope for project-management workflows and related catalogs. */\nexport const PM_CATALOG_SCOPE = 'project-management.pm';\n\n/** Canonical entity source for {@link AXPEntityReference.type} on project subjects. */\nexport const PM_PROJECT_ENTITY_SOURCE = 'ProjectManagement.Project';\n","export const AXPProjectManagementMenuKeys = {\n Root: 'project-management:menu',\n Projects: 'project-management:menu:projects',\n ProjectTypes: 'project-management:menu:project-types',\n Tasks: 'project-management:menu:tasks',\n TaskTypes: 'project-management:menu:task-types',\n} as const;\n\n","/**\n * Projects & Work capabilities used by this module.\n * Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).\n */\nexport const AXPProjectsWorkPermissionKeys = {\n Access: 'ProjectsWork:Permission:Access',\n MaintainProjects: 'ProjectsWork:Permission:MaintainProjects',\n MaintainTasks: 'ProjectsWork:Permission:MaintainTasks',\n ViewAllTasks: 'ProjectsWork:Permission:ViewAllTasks',\n MaintainTimesheets: 'ProjectsWork:Permission:MaintainTimesheets',\n ManageTimesheetActions: 'ProjectsWork:Permission:ManageTimesheetActions',\n ViewTimesheetReports: 'ProjectsWork:Permission:ViewTimesheetReports',\n Setup: 'ProjectsWork:Permission:Setup',\n} as const;\n\n/** @deprecated Prefer {@link AXPProjectsWorkPermissionKeys}. */\nexport const AXMPermissionsKeys = {\n ProjectManagement: {\n Management: AXPProjectsWorkPermissionKeys.Access,\n Project: {\n Management: AXPProjectsWorkPermissionKeys.MaintainProjects,\n },\n ProjectType: {\n Management: AXPProjectsWorkPermissionKeys.Setup,\n },\n },\n} as const;\n","const config = {\n i18n: 'project-management',\n module: 'ProjectManagement', \n};\nexport const RootConfig = {\n config,\n module: {\n module: 'ProjectManagement',\n name: 'ProjectManagement',\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-clipboard-list-check',\n },\n entities: {\n projectTypeRoleType: {\n name: 'ProjectTypeRoleType',\n title: '@project-management:projects.project-type-role-types.title',\n titlePlural: '@project-management:projects.project-type-role-types.plural',\n icon: 'fa-light fa-user',\n },\n projectMember: {\n name: 'ProjectMember',\n title: '@project-management:projects.project-members.title',\n titlePlural: '@project-management:projects.project-members.plural',\n icon: 'fa-light fa-users',\n }, \n projectType: {\n name: 'ProjectType', \n title: `@project-management:projects.project-types.title`,\n titlePlural: `@project-management:projects.project-types.plural`,\n icon: 'fa-light fa-rectangle-vertical-history',\n },\n projectTypeCategory: {\n name: 'ProjectTypeCategory',\n title: '@project-management:projects.project-type-categories.title',\n titlePlural: '@project-management:projects.project-type-categories.plural',\n icon: 'fa-light fa-layer-group',\n },\n project: {\n name: 'Project',\n source: `${config.module}.Project`,\n title: '@project-management:projects.terms.title',\n titlePlural: '@project-management:projects.terms.plural',\n icon: 'fa-light fa-square-kanban',\n },\n },\n queries: {\n dashboard: {\n activeProjectsKpi: `${config.module}:Dashboard:ActiveProjectsKpi`,\n projectsByStatusBar: `${config.module}:Dashboard:ProjectsByStatusBar`,\n projectsTasksCountBar: `${config.module}:Dashboard:ProjectsTasksCountBar`,\n customersProjectsCountBar: `${config.module}:Dashboard:CustomersProjectsCountBar`,\n },\n reports: {\n getProjectsByStatus: `${config.module}:Reports:GetProjectsByStatus`,\n getMemberWorkload: `${config.module}:Reports:GetMemberWorkload`,\n },\n },\n} as const;\n","//#region ---- Contracts barrel ----\n\nexport * from './catalog-scope.keys';\nexport * from './menu.keys';\nexport * from './permission.keys';\n\nexport * from './root-config';\n\n//#endregion\n\nexport * from './entities';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,676 @@
|
|
|
1
|
+
import { AXP_MODULE_MANIFEST_PROVIDER, AXP_CATALOG_SCOPE_DEFINITION_PROVIDER, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER } from '@acorex-platform/framework-client/core';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { Injectable, inject, NgModule } from '@angular/core';
|
|
4
|
+
import { RootConfig, AXPProjectsWorkPermissionKeys, AXPProjectManagementMenuKeys, PM_CATALOG_SCOPE, PM_PROJECT_ENTITY_SOURCE } from '@acorex-platform/module-project-management-client/contracts';
|
|
5
|
+
import { AXPRuntimeModule } from '@acorex-platform/framework-client/runtime';
|
|
6
|
+
import { AXPSearchCommandProvider, createEntitySearchCommand, AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER, AXP_STATUS_PROVIDERS } from '@acorex-platform/framework-client/common';
|
|
7
|
+
import { AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/auth';
|
|
8
|
+
import { AXPEntityService, AXP_ENTITY_MODIFIER } from '@acorex-platform/framework-client/layout/entity';
|
|
9
|
+
import { AXPCommonPermissionGroupKeys, AXPCommonMenuKeys } from '@acorex-platform/module-common-client/contracts';
|
|
10
|
+
import { AXPStatusProvider } from '@acorex-platform/framework-shared/core';
|
|
11
|
+
import { entityDetailsDeleteAction, AXPEntityCommandScope } from '@acorex-platform/framework-shared/entity';
|
|
12
|
+
import { AXPTaskManagementCommandKeys } from '@acorex-platform/module-task-management-client/contracts';
|
|
13
|
+
import { isEmpty, defaultTo, merge, isString, uniq } from 'lodash';
|
|
14
|
+
|
|
15
|
+
//#region ---- Imports ----
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region ---- Manifest Definition ----
|
|
18
|
+
/**
|
|
19
|
+
* Project Management Module Manifest.
|
|
20
|
+
* Defines module metadata, features, and provider references.
|
|
21
|
+
*/
|
|
22
|
+
const ProjectManagementManifest = {
|
|
23
|
+
name: RootConfig.module.name,
|
|
24
|
+
version: '1.0.0',
|
|
25
|
+
title: RootConfig.module.title,
|
|
26
|
+
icon: RootConfig.module.icon,
|
|
27
|
+
i18n: RootConfig.config.i18n,
|
|
28
|
+
type: 'domain',
|
|
29
|
+
domain: 'project-management',
|
|
30
|
+
// Module dependencies (optional)
|
|
31
|
+
};
|
|
32
|
+
//#endregion
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region ---- Permission Definition Provider ----
|
|
36
|
+
/**
|
|
37
|
+
* Registers Projects & Work capabilities owned by project-management.
|
|
38
|
+
*/
|
|
39
|
+
class AXMPermissionDefinitionProvider {
|
|
40
|
+
async define(context) {
|
|
41
|
+
const keys = AXPProjectsWorkPermissionKeys;
|
|
42
|
+
const groups = AXPCommonPermissionGroupKeys;
|
|
43
|
+
const P = '@common:projects-work.permissions';
|
|
44
|
+
const G = '@common:permission-groups';
|
|
45
|
+
context.addGroup(groups.ProjectsWork.Root, `${G}.projects-work.title`, `${G}.projects-work.description`, { order: 60 });
|
|
46
|
+
context
|
|
47
|
+
.addGroup(groups.ProjectsWork.Projects, `${G}.projects-work-projects.title`, `${G}.projects-work-projects.description`, { parent: groups.ProjectsWork.Root, order: 10 })
|
|
48
|
+
.addPermission(keys.Access, `${P}.access.title`, `${P}.access.description`)
|
|
49
|
+
.endPermission()
|
|
50
|
+
.addPermission(keys.MaintainProjects, `${P}.maintain-projects.title`, `${P}.maintain-projects.description`)
|
|
51
|
+
.endPermission()
|
|
52
|
+
.addPermission(keys.Setup, `${P}.setup.title`, `${P}.setup.description`)
|
|
53
|
+
.endPermission()
|
|
54
|
+
.endGroup();
|
|
55
|
+
}
|
|
56
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMPermissionDefinitionProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
57
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMPermissionDefinitionProvider }); }
|
|
58
|
+
}
|
|
59
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMPermissionDefinitionProvider, decorators: [{
|
|
60
|
+
type: Injectable
|
|
61
|
+
}] });
|
|
62
|
+
|
|
63
|
+
class AXMMenuProvider {
|
|
64
|
+
constructor() {
|
|
65
|
+
this.entityService = inject(AXPEntityService);
|
|
66
|
+
}
|
|
67
|
+
async provide(context) {
|
|
68
|
+
const module = RootConfig.module;
|
|
69
|
+
const keys = AXPProjectsWorkPermissionKeys;
|
|
70
|
+
context.addItems([
|
|
71
|
+
{
|
|
72
|
+
name: AXPProjectManagementMenuKeys.Root,
|
|
73
|
+
priority: 8100,
|
|
74
|
+
text: '@project-management:projects.terms.plural',
|
|
75
|
+
path: this.entityService.createPath(module.name, RootConfig.entities.project.name),
|
|
76
|
+
icon: RootConfig.entities.project.icon,
|
|
77
|
+
policy: {
|
|
78
|
+
features: [module.name],
|
|
79
|
+
permissions: [keys.MaintainProjects],
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
]);
|
|
83
|
+
context.find(AXPCommonMenuKeys.Projects).addItems([
|
|
84
|
+
{
|
|
85
|
+
name: AXPProjectManagementMenuKeys.ProjectTypes,
|
|
86
|
+
text: '@project-management:projects.project-types.plural',
|
|
87
|
+
icon: RootConfig.entities.projectType.icon,
|
|
88
|
+
priority: 1,
|
|
89
|
+
path: this.entityService
|
|
90
|
+
.withEntity(module.name, RootConfig.entities.projectType.name)
|
|
91
|
+
.createPath(),
|
|
92
|
+
policy: {
|
|
93
|
+
features: [module.name],
|
|
94
|
+
permissions: [keys.Setup],
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
]);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
class AXMSettingProvider {
|
|
102
|
+
async provide(context) {
|
|
103
|
+
// context
|
|
104
|
+
// // Add Form Template Group
|
|
105
|
+
// .addGroup('form-template', 'Form Template', 'Settings related to form templates.', RootConfig.module.icon)
|
|
106
|
+
// // Start Interface Section
|
|
107
|
+
// .addSection('interface', 'UI Interface', 'Customize the user interface for forms.')
|
|
108
|
+
// .addSetting({
|
|
109
|
+
// key: 'history-panel',
|
|
110
|
+
// title: 'Show History Panel',
|
|
111
|
+
// scope: 'U',
|
|
112
|
+
// isInherited: true,
|
|
113
|
+
// defaultValue: false,
|
|
114
|
+
// widget: {
|
|
115
|
+
// type: AXPWidgetsCatalog.toggle,
|
|
116
|
+
// },
|
|
117
|
+
// description: 'Enable or disable the history panel for forms.',
|
|
118
|
+
// validationRules: [
|
|
119
|
+
// {
|
|
120
|
+
// rule: 'required',
|
|
121
|
+
// },
|
|
122
|
+
// ],
|
|
123
|
+
// })
|
|
124
|
+
// .endSection()
|
|
125
|
+
// .endGroup();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
class AXMSearchCommandProvider extends AXPSearchCommandProvider {
|
|
130
|
+
constructor() {
|
|
131
|
+
super(...arguments);
|
|
132
|
+
this.commands = [
|
|
133
|
+
createEntitySearchCommand({
|
|
134
|
+
id: 'create-project',
|
|
135
|
+
entityKey: `${RootConfig.module.name}.${RootConfig.entities.project.name}`,
|
|
136
|
+
entityInfo: { name: RootConfig.entities.project.name, module: RootConfig.module.name, title: RootConfig.entities.project.title },
|
|
137
|
+
titleKey: '@project-management:projects.search-commands.create-project.title',
|
|
138
|
+
descriptionKey: '@project-management:projects.search-commands.create-project.description',
|
|
139
|
+
icon: RootConfig.entities.project.icon,
|
|
140
|
+
}),
|
|
141
|
+
createEntitySearchCommand({
|
|
142
|
+
id: 'create-project-type',
|
|
143
|
+
entityKey: `${RootConfig.module.name}.${RootConfig.entities.projectType.name}`,
|
|
144
|
+
entityInfo: { name: RootConfig.entities.projectType.name, module: RootConfig.module.name, title: RootConfig.entities.projectType.title },
|
|
145
|
+
titleKey: '@project-management:projects.search-commands.create-project-type.title',
|
|
146
|
+
descriptionKey: '@project-management:projects.search-commands.create-project-type.description',
|
|
147
|
+
icon: RootConfig.entities.projectType.icon,
|
|
148
|
+
}),
|
|
149
|
+
];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
//#region ---- Imports ----
|
|
154
|
+
//#endregion
|
|
155
|
+
//#region ---- Project Status Provider ----
|
|
156
|
+
/**
|
|
157
|
+
* Helper function to create status definitions
|
|
158
|
+
*/
|
|
159
|
+
const status = (name, title, color, options = {}) => ({
|
|
160
|
+
name,
|
|
161
|
+
title,
|
|
162
|
+
color,
|
|
163
|
+
...options,
|
|
164
|
+
});
|
|
165
|
+
class AXMProjectStatusProvider extends AXPStatusProvider {
|
|
166
|
+
constructor() {
|
|
167
|
+
super(...arguments);
|
|
168
|
+
this.key = 'project-management.status.projectStatus';
|
|
169
|
+
this.statuses = [
|
|
170
|
+
status('Initial', '@project-management:projects.meeting-participants.states.initial', 'neutral', {
|
|
171
|
+
order: 1,
|
|
172
|
+
generateView: true,
|
|
173
|
+
isInitial: true,
|
|
174
|
+
icon: 'fa-light fa-circle-dot',
|
|
175
|
+
}),
|
|
176
|
+
status('In Progress', '@meeting-management:meetings.meeting-participants.states.present', 'warning', {
|
|
177
|
+
order: 2,
|
|
178
|
+
generateView: true,
|
|
179
|
+
icon: 'fa-light fa-spinner',
|
|
180
|
+
}),
|
|
181
|
+
status('Completed', '@meeting-management:meetings.meeting-participants.states.accept', 'success', {
|
|
182
|
+
order: 3,
|
|
183
|
+
generateView: true,
|
|
184
|
+
isFinal: true,
|
|
185
|
+
icon: 'fa-light fa-check-circle',
|
|
186
|
+
}),
|
|
187
|
+
status('Archived', '@meeting-management:meetings.meeting-participants.states.decline', 'danger', {
|
|
188
|
+
order: 4,
|
|
189
|
+
generateView: true,
|
|
190
|
+
isFinal: true,
|
|
191
|
+
icon: 'fa-light fa-box-archive',
|
|
192
|
+
}),
|
|
193
|
+
];
|
|
194
|
+
this.transitions = [
|
|
195
|
+
{
|
|
196
|
+
from: 'Initial',
|
|
197
|
+
to: 'In Progress',
|
|
198
|
+
title: '@meeting-management:meetings.meeting-participants.transitions.mark-present',
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
from: 'In Progress',
|
|
202
|
+
to: 'Completed',
|
|
203
|
+
title: '@meeting-management:meetings.meeting-participants.transitions.accept',
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
from: 'Completed',
|
|
207
|
+
to: 'Archived',
|
|
208
|
+
title: '@meeting-management:meetings.meeting-participants.transitions.decline',
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
from: 'In Progress',
|
|
212
|
+
to: 'Initial',
|
|
213
|
+
title: '@meeting-management:meetings.meeting-participants.transitions.mark-absent',
|
|
214
|
+
},
|
|
215
|
+
];
|
|
216
|
+
this.defaultStatus = 'Initial';
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//#endregion
|
|
220
|
+
|
|
221
|
+
//#region ----- Imports -----
|
|
222
|
+
//#endregion
|
|
223
|
+
//#region ----- Constants -----
|
|
224
|
+
/**
|
|
225
|
+
* Mirrors `AXEPMExtensionSettings.DefaultProjectTypeId`
|
|
226
|
+
* (module must not import extension contracts).
|
|
227
|
+
*/
|
|
228
|
+
const DEFAULT_PROJECT_TYPE_SETTING_KEY = 'ProjectManagementExtension:Setting:DefaultProjectTypeId';
|
|
229
|
+
const DEFAULT_PROJECT_TYPE_EXPR = `{{ settings.get('${DEFAULT_PROJECT_TYPE_SETTING_KEY}') }}`;
|
|
230
|
+
/** Editable on create; locked once the project has an id. */
|
|
231
|
+
const CODE_READONLY_EXPR = '{{ !!context.eval("id") }}';
|
|
232
|
+
const TASK_RELATED_ENTITY = 'TaskManagement.Task';
|
|
233
|
+
//#endregion
|
|
234
|
+
//#region ----- Helpers -----
|
|
235
|
+
function actionCommandName(action) {
|
|
236
|
+
const command = action.command;
|
|
237
|
+
if (typeof command === 'string') {
|
|
238
|
+
return command;
|
|
239
|
+
}
|
|
240
|
+
if (command && typeof command === 'object' && 'name' in command) {
|
|
241
|
+
return String(command.name);
|
|
242
|
+
}
|
|
243
|
+
return undefined;
|
|
244
|
+
}
|
|
245
|
+
//#endregion
|
|
246
|
+
//#region ----- Project create/edit form modifier -----
|
|
247
|
+
/**
|
|
248
|
+
* Project create/edit form tweaks applied at resolve-time:
|
|
249
|
+
* - Default Type from tenant Default Project Type setting
|
|
250
|
+
* - Code editable on create, readonly on edit
|
|
251
|
+
* - Task related list includes Delete (workflow-run suppresses Task entity CRUD delete)
|
|
252
|
+
*/
|
|
253
|
+
const AXMProjectDefaultTypeEntityModifier = {
|
|
254
|
+
entityName: RootConfig.entities.project.name,
|
|
255
|
+
order: 20,
|
|
256
|
+
modifier: (ctx) => {
|
|
257
|
+
if (ctx.module.get() !== RootConfig.module.name) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const typeHandle = ctx.properties.find('projectTypeId');
|
|
261
|
+
if (typeHandle.get()) {
|
|
262
|
+
typeHandle.update((prop) => ({
|
|
263
|
+
...prop,
|
|
264
|
+
schema: {
|
|
265
|
+
...prop.schema,
|
|
266
|
+
defaultValue: DEFAULT_PROJECT_TYPE_EXPR,
|
|
267
|
+
},
|
|
268
|
+
}));
|
|
269
|
+
}
|
|
270
|
+
const codeHandle = ctx.properties.find('code');
|
|
271
|
+
if (codeHandle.get()) {
|
|
272
|
+
codeHandle.update((prop) => {
|
|
273
|
+
const interfaceOptions = { ...(prop.schema?.interface?.options ?? {}) };
|
|
274
|
+
delete interfaceOptions.disabled;
|
|
275
|
+
return {
|
|
276
|
+
...prop,
|
|
277
|
+
schema: {
|
|
278
|
+
...prop.schema,
|
|
279
|
+
readonly: CODE_READONLY_EXPR,
|
|
280
|
+
interface: {
|
|
281
|
+
...prop.schema?.interface,
|
|
282
|
+
options: interfaceOptions,
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
const related = ctx.relatedEntities.list() ?? [];
|
|
289
|
+
const taskRelated = related.find((r) => r.entity === TASK_RELATED_ENTITY);
|
|
290
|
+
if (!taskRelated) {
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
const deleteAction = entityDetailsDeleteAction();
|
|
294
|
+
const deleteCommand = actionCommandName(deleteAction);
|
|
295
|
+
const hasDelete = (taskRelated.actions ?? []).some((action) => actionCommandName(action) === deleteCommand);
|
|
296
|
+
if (!hasDelete) {
|
|
297
|
+
taskRelated.actions = [...(taskRelated.actions ?? []), deleteAction];
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
//#endregion
|
|
302
|
+
|
|
303
|
+
//#endregion
|
|
304
|
+
//#region ---- Constants ----
|
|
305
|
+
const WORKFLOW_DEFINITION = 'WorkflowManagement.WorkflowDefinition';
|
|
306
|
+
//#endregion
|
|
307
|
+
//#region ---- Provider ----
|
|
308
|
+
class AXMProjectManagementCatalogScopeDefinitionProvider {
|
|
309
|
+
async items() {
|
|
310
|
+
return [
|
|
311
|
+
{
|
|
312
|
+
name: PM_CATALOG_SCOPE,
|
|
313
|
+
title: '@project-management:catalog-scopes.pm.title',
|
|
314
|
+
description: '@project-management:catalog-scopes.pm.description',
|
|
315
|
+
targets: [WORKFLOW_DEFINITION],
|
|
316
|
+
icon: 'fa-light fa-diagram-project',
|
|
317
|
+
cssClass: 'secondary-lighter-surface',
|
|
318
|
+
order: 15,
|
|
319
|
+
},
|
|
320
|
+
];
|
|
321
|
+
}
|
|
322
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMProjectManagementCatalogScopeDefinitionProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
323
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMProjectManagementCatalogScopeDefinitionProvider }); }
|
|
324
|
+
}
|
|
325
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMProjectManagementCatalogScopeDefinitionProvider, decorators: [{
|
|
326
|
+
type: Injectable
|
|
327
|
+
}] });
|
|
328
|
+
|
|
329
|
+
//#region ---- Imports ----
|
|
330
|
+
//#endregion
|
|
331
|
+
/**
|
|
332
|
+
* Expression-evaluator scope for project "Start task" dropdown items (allowed task types).
|
|
333
|
+
*/
|
|
334
|
+
class AXMProjectManagementAllowedTaskTypesExpressionEvaluatorScopeProvider {
|
|
335
|
+
constructor() {
|
|
336
|
+
//#region ---- Services & Dependencies ----
|
|
337
|
+
this.entityService = inject(AXPEntityService);
|
|
338
|
+
//#endregion
|
|
339
|
+
}
|
|
340
|
+
//#endregion
|
|
341
|
+
//#region ---- AXPExpressionEvaluatorScopeProvider ----
|
|
342
|
+
async provide(context) {
|
|
343
|
+
context.addScope(RootConfig.module.name, {
|
|
344
|
+
AllowedTaskTypes: async (projectTypeIdRaw) => {
|
|
345
|
+
try {
|
|
346
|
+
const projectTypeId = typeof projectTypeIdRaw === 'string' ? projectTypeIdRaw.trim() : '';
|
|
347
|
+
if (!projectTypeId) {
|
|
348
|
+
return [];
|
|
349
|
+
}
|
|
350
|
+
const allowedRows = await this.loadAllowedTaskTypes(projectTypeId);
|
|
351
|
+
if (isEmpty(allowedRows)) {
|
|
352
|
+
return [];
|
|
353
|
+
}
|
|
354
|
+
return allowedRows.map((row) => this.buildAction(row));
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
console.error(`${RootConfig.module.name}.AllowedTaskTypes failed:`, error instanceof Error ? error.message : error);
|
|
358
|
+
return [];
|
|
359
|
+
}
|
|
360
|
+
},
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
//#endregion
|
|
364
|
+
//#region ---- Helpers ----
|
|
365
|
+
async loadAllowedTaskTypes(projectTypeId) {
|
|
366
|
+
const projectType = (await this.entityService
|
|
367
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.projectType.name)
|
|
368
|
+
.data()
|
|
369
|
+
.byKey(projectTypeId));
|
|
370
|
+
if (!projectType) {
|
|
371
|
+
return [];
|
|
372
|
+
}
|
|
373
|
+
const taskTypeIds = this.resolveAllowedTaskTypeIds(projectType);
|
|
374
|
+
const enriched = [];
|
|
375
|
+
for (const taskTypeId of taskTypeIds) {
|
|
376
|
+
const trimmedId = taskTypeId?.trim();
|
|
377
|
+
if (!trimmedId) {
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
380
|
+
const taskTypeDetail = (await this.entityService
|
|
381
|
+
.withEntity('TaskManagement', 'TaskType')
|
|
382
|
+
.data()
|
|
383
|
+
.byKey(trimmedId));
|
|
384
|
+
if (!taskTypeDetail?.isActive) {
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
387
|
+
enriched.push({
|
|
388
|
+
taskTypeId: trimmedId,
|
|
389
|
+
projectTypeId,
|
|
390
|
+
taskTypeDetail: {
|
|
391
|
+
id: taskTypeDetail.id,
|
|
392
|
+
title: taskTypeDetail.title,
|
|
393
|
+
workflowConfig: taskTypeDetail.workflowConfig,
|
|
394
|
+
isActive: taskTypeDetail.isActive,
|
|
395
|
+
},
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
return enriched;
|
|
399
|
+
}
|
|
400
|
+
resolveAllowedTaskTypeIds(projectType) {
|
|
401
|
+
const fromRefs = projectType.allowedTaskTypes?.map((row) => row.id).filter(Boolean) ?? [];
|
|
402
|
+
if (!isEmpty(fromRefs)) {
|
|
403
|
+
return fromRefs;
|
|
404
|
+
}
|
|
405
|
+
return defaultTo(projectType.allowedTaskTypeIds, []).filter((id) => typeof id === 'string' && id.trim().length > 0);
|
|
406
|
+
}
|
|
407
|
+
buildAction(row) {
|
|
408
|
+
const taskTypeId = row.taskTypeId;
|
|
409
|
+
const taskTypeTitle = row.taskTypeDetail?.title ?? taskTypeId;
|
|
410
|
+
const workflowConfig = row.taskTypeDetail?.workflowConfig;
|
|
411
|
+
const workflowId = workflowConfig?.workflowName?.trim();
|
|
412
|
+
const guidedFlowCommand = workflowId
|
|
413
|
+
? {
|
|
414
|
+
name: AXPTaskManagementCommandKeys.Task.StartFlow,
|
|
415
|
+
options: {
|
|
416
|
+
workflowId,
|
|
417
|
+
input: merge(defaultTo(workflowConfig?.defaultInput, {}), {
|
|
418
|
+
taskTypeId,
|
|
419
|
+
taskTypeTitle,
|
|
420
|
+
projectTypeId: row.projectTypeId,
|
|
421
|
+
subjectRef: {
|
|
422
|
+
type: PM_PROJECT_ENTITY_SOURCE,
|
|
423
|
+
id: '{{ context.eval("id") }}',
|
|
424
|
+
title: '{{ context.eval("title") }}',
|
|
425
|
+
},
|
|
426
|
+
}),
|
|
427
|
+
},
|
|
428
|
+
}
|
|
429
|
+
: undefined;
|
|
430
|
+
const notConfiguredCommand = {
|
|
431
|
+
name: 'workflow-activity:show-toast',
|
|
432
|
+
options: {
|
|
433
|
+
message: '@project-management:projects.messages.task-type-not-configured',
|
|
434
|
+
type: 'warning',
|
|
435
|
+
},
|
|
436
|
+
};
|
|
437
|
+
return {
|
|
438
|
+
name: `start-project-task-${taskTypeId}`,
|
|
439
|
+
title: taskTypeTitle,
|
|
440
|
+
icon: 'fa-light fa-play',
|
|
441
|
+
color: 'default',
|
|
442
|
+
command: guidedFlowCommand ?? notConfiguredCommand,
|
|
443
|
+
priority: 'primary',
|
|
444
|
+
type: 'create',
|
|
445
|
+
scope: AXPEntityCommandScope.TypeLevel,
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
//#region ---- Imports ----
|
|
451
|
+
//#endregion
|
|
452
|
+
/**
|
|
453
|
+
* Expression-evaluator scope for resolving allowed document type names from a project record.
|
|
454
|
+
* Unions document type names configured on each allowed TaskType for the project's ProjectType.
|
|
455
|
+
*/
|
|
456
|
+
class AXMProjectManagementDocumentTypeNamesExpressionEvaluatorScopeProvider {
|
|
457
|
+
constructor() {
|
|
458
|
+
//#region ---- Services & Dependencies ----
|
|
459
|
+
this.entityService = inject(AXPEntityService);
|
|
460
|
+
//#endregion
|
|
461
|
+
}
|
|
462
|
+
//#endregion
|
|
463
|
+
//#region ---- AXPExpressionEvaluatorScopeProvider ----
|
|
464
|
+
async provide(context) {
|
|
465
|
+
context.addScope(RootConfig.module.name, {
|
|
466
|
+
resolveDocumentTypeNames: async (projectIdRaw) => {
|
|
467
|
+
try {
|
|
468
|
+
const projectId = isString(projectIdRaw) ? projectIdRaw.trim() : '';
|
|
469
|
+
if (!projectId) {
|
|
470
|
+
return [];
|
|
471
|
+
}
|
|
472
|
+
return await this.loadAllowedDocumentTypeNamesForProject(projectId);
|
|
473
|
+
}
|
|
474
|
+
catch (error) {
|
|
475
|
+
console.error(`${RootConfig.module.name}.resolveDocumentTypeNames failed:`, error instanceof Error ? error.message : error);
|
|
476
|
+
return [];
|
|
477
|
+
}
|
|
478
|
+
},
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
//#endregion
|
|
482
|
+
//#region ---- Helpers ----
|
|
483
|
+
async loadAllowedDocumentTypeNamesForProject(projectId) {
|
|
484
|
+
const project = (await this.entityService
|
|
485
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.project.name)
|
|
486
|
+
.data()
|
|
487
|
+
.byKey(projectId));
|
|
488
|
+
if (!project) {
|
|
489
|
+
return [];
|
|
490
|
+
}
|
|
491
|
+
const projectTypeId = this.resolveProjectTypeId(project);
|
|
492
|
+
if (!projectTypeId) {
|
|
493
|
+
return [];
|
|
494
|
+
}
|
|
495
|
+
const projectType = (await this.entityService
|
|
496
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.projectType.name)
|
|
497
|
+
.data()
|
|
498
|
+
.byKey(projectTypeId));
|
|
499
|
+
if (!projectType) {
|
|
500
|
+
return [];
|
|
501
|
+
}
|
|
502
|
+
const taskTypeIds = this.resolveAllowedTaskTypeIds(projectType);
|
|
503
|
+
if (isEmpty(taskTypeIds)) {
|
|
504
|
+
return [];
|
|
505
|
+
}
|
|
506
|
+
const names = [];
|
|
507
|
+
for (const taskTypeId of taskTypeIds) {
|
|
508
|
+
const trimmedId = taskTypeId?.trim();
|
|
509
|
+
if (!trimmedId) {
|
|
510
|
+
continue;
|
|
511
|
+
}
|
|
512
|
+
const taskType = (await this.entityService
|
|
513
|
+
.withEntity('TaskManagement', 'TaskType')
|
|
514
|
+
.data()
|
|
515
|
+
.byKey(trimmedId));
|
|
516
|
+
if (!taskType?.isActive) {
|
|
517
|
+
continue;
|
|
518
|
+
}
|
|
519
|
+
names.push(...this.extractDocumentTypeNames(taskType));
|
|
520
|
+
}
|
|
521
|
+
return uniq(names.filter((name) => name.trim().length > 0));
|
|
522
|
+
}
|
|
523
|
+
resolveProjectTypeId(project) {
|
|
524
|
+
const fromNested = project.projectType?.id;
|
|
525
|
+
if (isString(fromNested) && fromNested.trim()) {
|
|
526
|
+
return fromNested.trim();
|
|
527
|
+
}
|
|
528
|
+
const raw = project.projectTypeId;
|
|
529
|
+
if (isString(raw) && raw.trim()) {
|
|
530
|
+
return raw.trim();
|
|
531
|
+
}
|
|
532
|
+
if (raw && typeof raw === 'object' && isString(raw.id)) {
|
|
533
|
+
return (raw.id ?? '').trim();
|
|
534
|
+
}
|
|
535
|
+
return '';
|
|
536
|
+
}
|
|
537
|
+
resolveAllowedTaskTypeIds(projectType) {
|
|
538
|
+
const fromRefs = projectType.allowedTaskTypes?.map((row) => row.id).filter(Boolean) ?? [];
|
|
539
|
+
if (!isEmpty(fromRefs)) {
|
|
540
|
+
return fromRefs;
|
|
541
|
+
}
|
|
542
|
+
return defaultTo(projectType.allowedTaskTypeIds, []).filter((id) => isString(id) && id.trim().length > 0);
|
|
543
|
+
}
|
|
544
|
+
extractDocumentTypeNames(taskType) {
|
|
545
|
+
return (taskType.documentTypes ?? [])
|
|
546
|
+
.map((row) => row?.name)
|
|
547
|
+
.filter((name) => isString(name) && name.trim().length > 0)
|
|
548
|
+
.map((name) => name.trim());
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
class AXMProjectManagementModule {
|
|
553
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMProjectManagementModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
554
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXMProjectManagementModule, imports: [AXPRuntimeModule] }); }
|
|
555
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMProjectManagementModule, providers: [
|
|
556
|
+
{
|
|
557
|
+
provide: AXP_MODULE_MANIFEST_PROVIDER,
|
|
558
|
+
useValue: ProjectManagementManifest,
|
|
559
|
+
multi: true,
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
provide: AXP_PERMISSION_DEFINITION_PROVIDER,
|
|
563
|
+
useClass: AXMPermissionDefinitionProvider,
|
|
564
|
+
multi: true,
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
provide: AXP_MENU_PROVIDER,
|
|
568
|
+
useClass: AXMMenuProvider,
|
|
569
|
+
multi: true,
|
|
570
|
+
},
|
|
571
|
+
{
|
|
572
|
+
provide: AXP_SETTING_DEFINITION_PROVIDER,
|
|
573
|
+
useClass: AXMSettingProvider,
|
|
574
|
+
multi: true,
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
provide: AXP_SEARCH_PROVIDER,
|
|
578
|
+
useClass: AXMSearchCommandProvider,
|
|
579
|
+
multi: true,
|
|
580
|
+
},
|
|
581
|
+
{
|
|
582
|
+
provide: AXP_STATUS_PROVIDERS,
|
|
583
|
+
useClass: AXMProjectStatusProvider,
|
|
584
|
+
multi: true,
|
|
585
|
+
},
|
|
586
|
+
{
|
|
587
|
+
provide: AXP_CATALOG_SCOPE_DEFINITION_PROVIDER,
|
|
588
|
+
useClass: AXMProjectManagementCatalogScopeDefinitionProvider,
|
|
589
|
+
multi: true,
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
|
|
593
|
+
useClass: AXMProjectManagementAllowedTaskTypesExpressionEvaluatorScopeProvider,
|
|
594
|
+
multi: true,
|
|
595
|
+
},
|
|
596
|
+
{
|
|
597
|
+
provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
|
|
598
|
+
useClass: AXMProjectManagementDocumentTypeNamesExpressionEvaluatorScopeProvider,
|
|
599
|
+
multi: true,
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
provide: AXP_ENTITY_MODIFIER,
|
|
603
|
+
useValue: AXMProjectDefaultTypeEntityModifier,
|
|
604
|
+
multi: true,
|
|
605
|
+
},
|
|
606
|
+
], imports: [AXPRuntimeModule] }); }
|
|
607
|
+
}
|
|
608
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMProjectManagementModule, decorators: [{
|
|
609
|
+
type: NgModule,
|
|
610
|
+
args: [{
|
|
611
|
+
imports: [
|
|
612
|
+
AXPRuntimeModule,
|
|
613
|
+
],
|
|
614
|
+
exports: [],
|
|
615
|
+
declarations: [],
|
|
616
|
+
providers: [
|
|
617
|
+
{
|
|
618
|
+
provide: AXP_MODULE_MANIFEST_PROVIDER,
|
|
619
|
+
useValue: ProjectManagementManifest,
|
|
620
|
+
multi: true,
|
|
621
|
+
},
|
|
622
|
+
{
|
|
623
|
+
provide: AXP_PERMISSION_DEFINITION_PROVIDER,
|
|
624
|
+
useClass: AXMPermissionDefinitionProvider,
|
|
625
|
+
multi: true,
|
|
626
|
+
},
|
|
627
|
+
{
|
|
628
|
+
provide: AXP_MENU_PROVIDER,
|
|
629
|
+
useClass: AXMMenuProvider,
|
|
630
|
+
multi: true,
|
|
631
|
+
},
|
|
632
|
+
{
|
|
633
|
+
provide: AXP_SETTING_DEFINITION_PROVIDER,
|
|
634
|
+
useClass: AXMSettingProvider,
|
|
635
|
+
multi: true,
|
|
636
|
+
},
|
|
637
|
+
{
|
|
638
|
+
provide: AXP_SEARCH_PROVIDER,
|
|
639
|
+
useClass: AXMSearchCommandProvider,
|
|
640
|
+
multi: true,
|
|
641
|
+
},
|
|
642
|
+
{
|
|
643
|
+
provide: AXP_STATUS_PROVIDERS,
|
|
644
|
+
useClass: AXMProjectStatusProvider,
|
|
645
|
+
multi: true,
|
|
646
|
+
},
|
|
647
|
+
{
|
|
648
|
+
provide: AXP_CATALOG_SCOPE_DEFINITION_PROVIDER,
|
|
649
|
+
useClass: AXMProjectManagementCatalogScopeDefinitionProvider,
|
|
650
|
+
multi: true,
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
|
|
654
|
+
useClass: AXMProjectManagementAllowedTaskTypesExpressionEvaluatorScopeProvider,
|
|
655
|
+
multi: true,
|
|
656
|
+
},
|
|
657
|
+
{
|
|
658
|
+
provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
|
|
659
|
+
useClass: AXMProjectManagementDocumentTypeNamesExpressionEvaluatorScopeProvider,
|
|
660
|
+
multi: true,
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
provide: AXP_ENTITY_MODIFIER,
|
|
664
|
+
useValue: AXMProjectDefaultTypeEntityModifier,
|
|
665
|
+
multi: true,
|
|
666
|
+
},
|
|
667
|
+
],
|
|
668
|
+
}]
|
|
669
|
+
}] });
|
|
670
|
+
|
|
671
|
+
/**
|
|
672
|
+
* Generated bundle index. Do not edit.
|
|
673
|
+
*/
|
|
674
|
+
|
|
675
|
+
export { AXMMenuProvider, AXMProjectManagementModule, AXMSearchCommandProvider, AXMSettingProvider };
|
|
676
|
+
//# sourceMappingURL=acorex-platform-module-project-management-client.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-project-management-client.mjs","sources":["../../../../libs/modules/project-management/client/src/lib/manifest.ts","../../../../libs/modules/project-management/client/src/lib/permission-definition.provider.ts","../../../../libs/modules/project-management/client/src/lib/menu.provider.ts","../../../../libs/modules/project-management/client/src/lib/setting.provider.ts","../../../../libs/modules/project-management/client/src/lib/search-command.provider.ts","../../../../libs/modules/project-management/client/src/lib/features/project/project-status.provider.ts","../../../../libs/modules/project-management/client/src/lib/features/project/project-default-type.entity-modifier.ts","../../../../libs/modules/project-management/client/src/lib/catalog-scope-definition.provider.ts","../../../../libs/modules/project-management/client/src/lib/features/shared/allowed-task-types-expression-evaluator-scope.provider.ts","../../../../libs/modules/project-management/client/src/lib/features/shared/document-type-names-expression-evaluator-scope.provider.ts","../../../../libs/modules/project-management/client/src/lib/project-management.module.ts","../../../../libs/modules/project-management/client/src/acorex-platform-module-project-management-client.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPModuleManifest } from '@acorex-platform/framework-client/core';\nimport { RootConfig } from '@acorex-platform/module-project-management-client/contracts';\n\n//#endregion\n\n//#region ---- Manifest Definition ----\n\n/**\n * Project Management Module Manifest.\n * Defines module metadata, features, and provider references.\n */\nexport const ProjectManagementManifest: AXPModuleManifest = {\n name: RootConfig.module.name,\n version: '1.0.0',\n title: RootConfig.module.title,\n icon: RootConfig.module.icon,\n i18n: RootConfig.config.i18n,\n\n type: 'domain',\n domain: 'project-management',\n // Module dependencies (optional)\n};\n\n//#endregion\n\n","//#region ---- Imports ----\n\nimport {\n AXPPermissionDefinitionProvider,\n AXPPermissionDefinitionProviderContext,\n} from '@acorex-platform/framework-client/auth';\nimport {\n AXPCommonPermissionGroupKeys\n} from '@acorex-platform/module-common-client/contracts';\nimport {\n AXPProjectsWorkPermissionKeys\n} from '@acorex-platform/module-project-management-client/contracts';\n\nimport { Injectable } from '@angular/core';\n\n//#endregion\n\n//#region ---- Permission Definition Provider ----\n\n/**\n * Registers Projects & Work capabilities owned by project-management.\n */\n@Injectable()\nexport class AXMPermissionDefinitionProvider implements AXPPermissionDefinitionProvider {\n async define(context: AXPPermissionDefinitionProviderContext): Promise<void> {\n const keys = AXPProjectsWorkPermissionKeys;\n const groups = AXPCommonPermissionGroupKeys;\n const P = '@common:projects-work.permissions';\n const G = '@common:permission-groups';\n\n context.addGroup(groups.ProjectsWork.Root, `${G}.projects-work.title`, `${G}.projects-work.description`, { order: 60 });\n\n context\n .addGroup(\n groups.ProjectsWork.Projects,\n `${G}.projects-work-projects.title`,\n `${G}.projects-work-projects.description`,\n { parent: groups.ProjectsWork.Root, order: 10 },\n )\n .addPermission(keys.Access, `${P}.access.title`, `${P}.access.description`)\n .endPermission()\n .addPermission(keys.MaintainProjects, `${P}.maintain-projects.title`, `${P}.maintain-projects.description`)\n .endPermission()\n .addPermission(keys.Setup, `${P}.setup.title`, `${P}.setup.description`)\n .endPermission()\n .endGroup();\n }\n}\n\n//#endregion\n","import { AXPMenuProvider, AXPMenuProviderContext } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport {\n AXPCommonMenuKeys\n} from '@acorex-platform/module-common-client/contracts';\nimport { inject } from '@angular/core';\nimport {\n RootConfig,\n AXPProjectsWorkPermissionKeys\n} from '@acorex-platform/module-project-management-client/contracts';\nimport { AXPProjectManagementMenuKeys } from '@acorex-platform/module-project-management-client/contracts';\n\nexport class AXMMenuProvider implements AXPMenuProvider {\n private entityService = inject(AXPEntityService);\n\n async provide(context: AXPMenuProviderContext): Promise<void> {\n const module = RootConfig.module;\n const keys = AXPProjectsWorkPermissionKeys;\n\n context.addItems([\n {\n name: AXPProjectManagementMenuKeys.Root,\n priority: 8100,\n text: '@project-management:projects.terms.plural',\n path: this.entityService.createPath(module.name, RootConfig.entities.project.name),\n icon: RootConfig.entities.project.icon,\n policy: {\n features: [module.name],\n permissions: [keys.MaintainProjects],\n },\n },\n ]);\n\n context.find(AXPCommonMenuKeys.Projects).addItems([\n {\n name: AXPProjectManagementMenuKeys.ProjectTypes,\n text: '@project-management:projects.project-types.plural',\n icon: RootConfig.entities.projectType.icon,\n priority: 1,\n path: this.entityService\n .withEntity(module.name, RootConfig.entities.projectType.name)\n .createPath(),\n policy: {\n features: [module.name],\n permissions: [keys.Setup],\n },\n },\n ]);\n }\n}\n","import { AXPSettingDefinitionProvider, AXPSettingDefinitionProviderContext } from '@acorex-platform/framework-client/common';\n\nexport class AXMSettingProvider implements AXPSettingDefinitionProvider {\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n // context\n // // Add Form Template Group\n // .addGroup('form-template', 'Form Template', 'Settings related to form templates.', RootConfig.module.icon)\n // // Start Interface Section\n // .addSection('interface', 'UI Interface', 'Customize the user interface for forms.')\n // .addSetting({\n // key: 'history-panel',\n // title: 'Show History Panel',\n // scope: 'U',\n // isInherited: true,\n // defaultValue: false,\n // widget: {\n // type: AXPWidgetsCatalog.toggle,\n // },\n // description: 'Enable or disable the history panel for forms.',\n // validationRules: [\n // {\n // rule: 'required',\n // },\n // ],\n // })\n // .endSection()\n // .endGroup();\n }\n}\n","import { AXPSearchCommandProvider, createEntitySearchCommand } from '@acorex-platform/framework-client/common';\nimport { RootConfig } from '@acorex-platform/module-project-management-client/contracts';\n\nexport class AXMSearchCommandProvider extends AXPSearchCommandProvider {\n commands = [\n createEntitySearchCommand({\n id: 'create-project',\n entityKey: `${RootConfig.module.name}.${RootConfig.entities.project.name}`,\n entityInfo: { name: RootConfig.entities.project.name, module: RootConfig.module.name, title: RootConfig.entities.project.title },\n titleKey: '@project-management:projects.search-commands.create-project.title',\n descriptionKey: '@project-management:projects.search-commands.create-project.description',\n icon: RootConfig.entities.project.icon,\n }),\n createEntitySearchCommand({\n id: 'create-project-type',\n entityKey: `${RootConfig.module.name}.${RootConfig.entities.projectType.name}`,\n entityInfo: { name: RootConfig.entities.projectType.name, module: RootConfig.module.name, title: RootConfig.entities.projectType.title },\n titleKey: '@project-management:projects.search-commands.create-project-type.title',\n descriptionKey: '@project-management:projects.search-commands.create-project-type.description',\n icon: RootConfig.entities.projectType.icon,\n }),\n ];\n}\n","//#region ---- Imports ----\n\nimport { AXPStatusDefinition, AXPStatusProvider, AXPStatusTransition } from '@acorex-platform/framework-shared/core';\n\n//#endregion\n\n//#region ---- Project Status Provider ----\n\n/**\n * Helper function to create status definitions\n */\nconst status = (\n name: string,\n title: string,\n color: string,\n options: Partial<AXPStatusDefinition> = {},\n): AXPStatusDefinition => ({\n name,\n title,\n color,\n ...options,\n});\n\nexport class AXMProjectStatusProvider extends AXPStatusProvider {\n readonly key = 'project-management.status.projectStatus';\n\n readonly statuses: AXPStatusDefinition[] = [\n status('Initial', '@project-management:projects.meeting-participants.states.initial', 'neutral', {\n order: 1,\n generateView: true,\n isInitial: true,\n icon: 'fa-light fa-circle-dot',\n }),\n status('In Progress', '@meeting-management:meetings.meeting-participants.states.present', 'warning', {\n order: 2,\n generateView: true,\n icon: 'fa-light fa-spinner',\n }),\n status('Completed', '@meeting-management:meetings.meeting-participants.states.accept', 'success', {\n order: 3,\n generateView: true,\n isFinal: true,\n icon: 'fa-light fa-check-circle',\n }),\n status('Archived', '@meeting-management:meetings.meeting-participants.states.decline', 'danger', {\n order: 4,\n generateView: true,\n isFinal: true,\n icon: 'fa-light fa-box-archive',\n }),\n ];\n\n readonly transitions: AXPStatusTransition[] = [\n {\n from: 'Initial',\n to: 'In Progress',\n title: '@meeting-management:meetings.meeting-participants.transitions.mark-present',\n },\n {\n from: 'In Progress',\n to: 'Completed',\n title: '@meeting-management:meetings.meeting-participants.transitions.accept',\n },\n {\n from: 'Completed',\n to: 'Archived',\n title: '@meeting-management:meetings.meeting-participants.transitions.decline',\n },\n {\n from: 'In Progress',\n to: 'Initial',\n title: '@meeting-management:meetings.meeting-participants.transitions.mark-absent',\n },\n ];\n\n readonly defaultStatus = 'Initial';\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport {\n AXPEntityModifierProvider,\n} from '@acorex-platform/framework-client/layout/entity';\nimport {\n entityDetailsDeleteAction,\n} from '@acorex-platform/framework-shared/entity';\nimport { RootConfig } from '@acorex-platform/module-project-management-client/contracts';\n\n//#endregion\n\n//#region ----- Constants -----\n\n/**\n * Mirrors `AXEPMExtensionSettings.DefaultProjectTypeId`\n * (module must not import extension contracts).\n */\nconst DEFAULT_PROJECT_TYPE_SETTING_KEY =\n 'ProjectManagementExtension:Setting:DefaultProjectTypeId';\n\nconst DEFAULT_PROJECT_TYPE_EXPR = `{{ settings.get('${DEFAULT_PROJECT_TYPE_SETTING_KEY}') }}`;\n\n/** Editable on create; locked once the project has an id. */\nconst CODE_READONLY_EXPR = '{{ !!context.eval(\"id\") }}';\n\nconst TASK_RELATED_ENTITY = 'TaskManagement.Task';\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction actionCommandName(action: { command?: unknown }): string | undefined {\n const command = action.command;\n if (typeof command === 'string') {\n return command;\n }\n if (command && typeof command === 'object' && 'name' in command) {\n return String((command as { name: string }).name);\n }\n return undefined;\n}\n\n//#endregion\n\n//#region ----- Project create/edit form modifier -----\n\n/**\n * Project create/edit form tweaks applied at resolve-time:\n * - Default Type from tenant Default Project Type setting\n * - Code editable on create, readonly on edit\n * - Task related list includes Delete (workflow-run suppresses Task entity CRUD delete)\n */\nexport const AXMProjectDefaultTypeEntityModifier: AXPEntityModifierProvider = {\n entityName: RootConfig.entities.project.name,\n order: 20,\n modifier: (ctx) => {\n if (ctx.module.get() !== RootConfig.module.name) {\n return;\n }\n\n const typeHandle = ctx.properties.find('projectTypeId');\n if (typeHandle.get()) {\n typeHandle.update((prop) => ({\n ...prop,\n schema: {\n ...prop.schema,\n defaultValue: DEFAULT_PROJECT_TYPE_EXPR,\n },\n }));\n }\n\n const codeHandle = ctx.properties.find('code');\n if (codeHandle.get()) {\n codeHandle.update((prop) => {\n const interfaceOptions = { ...(prop.schema?.interface?.options ?? {}) };\n delete (interfaceOptions as { disabled?: unknown }).disabled;\n\n return {\n ...prop,\n schema: {\n ...prop.schema,\n readonly: CODE_READONLY_EXPR,\n interface: {\n ...prop.schema?.interface,\n options: interfaceOptions,\n },\n },\n };\n });\n }\n\n const related = ctx.relatedEntities.list() ?? [];\n const taskRelated = related.find((r) => r.entity === TASK_RELATED_ENTITY);\n if (!taskRelated) {\n return;\n }\n\n const deleteAction = entityDetailsDeleteAction();\n const deleteCommand = actionCommandName(deleteAction);\n const hasDelete = (taskRelated.actions ?? []).some(\n (action) => actionCommandName(action) === deleteCommand,\n );\n if (!hasDelete) {\n taskRelated.actions = [...(taskRelated.actions ?? []), deleteAction];\n }\n },\n};\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXPCatalogScopeDefinition, AXPCatalogScopeDefinitionProvider } from '@acorex-platform/framework-client/core';\nimport { Injectable } from '@angular/core';\nimport { PM_CATALOG_SCOPE } from '@acorex-platform/module-project-management-client/contracts';\n\n//#endregion\n\n//#region ---- Constants ----\n\nconst WORKFLOW_DEFINITION = 'WorkflowManagement.WorkflowDefinition';\n\n//#endregion\n\n//#region ---- Provider ----\n\n@Injectable()\nexport class AXMProjectManagementCatalogScopeDefinitionProvider implements AXPCatalogScopeDefinitionProvider {\n async items(): Promise<AXPCatalogScopeDefinition[]> {\n return [\n {\n name: PM_CATALOG_SCOPE,\n title: '@project-management:catalog-scopes.pm.title',\n description: '@project-management:catalog-scopes.pm.description',\n targets: [WORKFLOW_DEFINITION],\n icon: 'fa-light fa-diagram-project',\n cssClass: 'secondary-lighter-surface',\n order: 15,\n },\n ];\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPEntityAction, AXPEntityCommandScope } from '@acorex-platform/framework-shared/entity';\nimport {AXPTaskManagementCommandKeys} from '@acorex-platform/module-task-management-client/contracts'\nimport {type AXMTaskManagementTaskTypeEntityModel} from '@acorex-platform/module-task-management-client/contracts';\nimport { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from '@acorex-platform/framework-shared/core';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { inject } from '@angular/core';\nimport { defaultTo, isEmpty, merge } from 'lodash';\nimport { PM_PROJECT_ENTITY_SOURCE } from '@acorex-platform/module-project-management-client/contracts';\nimport { RootConfig } from '@acorex-platform/module-project-management-client/contracts';\nimport type { AXMProjectManagementProjectTypeEntityModel } from '@acorex-platform/module-project-management-client/contracts';\n\n//#endregion\n\n//#region ---- Types ----\n\ntype AllowedTaskTypeRef = {\n taskTypeId: string;\n projectTypeId: string;\n taskTypeDetail?: Pick<\n AXMTaskManagementTaskTypeEntityModel,\n 'id' | 'title' | 'workflowConfig' | 'isActive'\n >;\n};\n\n//#endregion\n\n/**\n * Expression-evaluator scope for project \"Start task\" dropdown items (allowed task types).\n */\nexport class AXMProjectManagementAllowedTaskTypesExpressionEvaluatorScopeProvider\n implements AXPExpressionEvaluatorScopeProvider {\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n\n //#endregion\n\n //#region ---- AXPExpressionEvaluatorScopeProvider ----\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope(RootConfig.module.name, {\n AllowedTaskTypes: async (projectTypeIdRaw?: unknown): Promise<AXPEntityAction[]> => {\n try {\n const projectTypeId = typeof projectTypeIdRaw === 'string' ? projectTypeIdRaw.trim() : '';\n if (!projectTypeId) {\n return [];\n }\n\n const allowedRows = await this.loadAllowedTaskTypes(projectTypeId);\n if (isEmpty(allowedRows)) {\n return [];\n }\n\n return allowedRows.map((row) => this.buildAction(row));\n } catch (error: unknown) {\n console.error(\n `${RootConfig.module.name}.AllowedTaskTypes failed:`,\n error instanceof Error ? error.message : error,\n );\n return [];\n }\n },\n });\n }\n\n //#endregion\n\n //#region ---- Helpers ----\n\n private async loadAllowedTaskTypes(projectTypeId: string): Promise<AllowedTaskTypeRef[]> {\n const projectType = (await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.projectType.name)\n .data()\n .byKey(projectTypeId)) as AXMProjectManagementProjectTypeEntityModel | null;\n\n if (!projectType) {\n return [];\n }\n\n const taskTypeIds = this.resolveAllowedTaskTypeIds(projectType);\n const enriched: AllowedTaskTypeRef[] = [];\n\n for (const taskTypeId of taskTypeIds) {\n const trimmedId = taskTypeId?.trim();\n if (!trimmedId) {\n continue;\n }\n const taskTypeDetail = (await this.entityService\n .withEntity('TaskManagement', 'TaskType')\n .data()\n .byKey(trimmedId)) as AXMTaskManagementTaskTypeEntityModel | null;\n if (!taskTypeDetail?.isActive) {\n continue;\n }\n enriched.push({\n taskTypeId: trimmedId,\n projectTypeId,\n taskTypeDetail: {\n id: taskTypeDetail.id,\n title: taskTypeDetail.title,\n workflowConfig: taskTypeDetail.workflowConfig,\n isActive: taskTypeDetail.isActive,\n },\n });\n }\n\n return enriched;\n }\n\n private resolveAllowedTaskTypeIds(projectType: AXMProjectManagementProjectTypeEntityModel): string[] {\n const fromRefs = projectType.allowedTaskTypes?.map((row) => row.id).filter(Boolean) ?? [];\n if (!isEmpty(fromRefs)) {\n return fromRefs;\n }\n return defaultTo(projectType.allowedTaskTypeIds, []).filter((id) => typeof id === 'string' && id.trim().length > 0);\n }\n\n private buildAction(row: AllowedTaskTypeRef): AXPEntityAction {\n const taskTypeId = row.taskTypeId;\n const taskTypeTitle = row.taskTypeDetail?.title ?? taskTypeId;\n const workflowConfig = row.taskTypeDetail?.workflowConfig;\n const workflowId = workflowConfig?.workflowName?.trim();\n\n const guidedFlowCommand = workflowId\n ? ({\n name: AXPTaskManagementCommandKeys.Task.StartFlow,\n options: {\n workflowId,\n input: merge(defaultTo(workflowConfig?.defaultInput, {}), {\n taskTypeId,\n taskTypeTitle,\n projectTypeId: row.projectTypeId,\n subjectRef: {\n type: PM_PROJECT_ENTITY_SOURCE,\n id: '{{ context.eval(\"id\") }}',\n title: '{{ context.eval(\"title\") }}',\n },\n }),\n },\n } satisfies AXPEntityAction['command'])\n : undefined;\n\n const notConfiguredCommand = {\n name: 'workflow-activity:show-toast',\n options: {\n message: '@project-management:projects.messages.task-type-not-configured',\n type: 'warning',\n },\n } satisfies AXPEntityAction['command'];\n\n return {\n name: `start-project-task-${taskTypeId}`,\n title: taskTypeTitle,\n icon: 'fa-light fa-play',\n color: 'default',\n command: guidedFlowCommand ?? notConfiguredCommand,\n priority: 'primary',\n type: 'create',\n scope: AXPEntityCommandScope.TypeLevel,\n } satisfies AXPEntityAction;\n }\n\n //#endregion\n}\n","//#region ---- Imports ----\n\nimport type { AXMTaskManagementTaskTypeEntityModel } from '@acorex-platform/module-task-management-client/contracts';\nimport { AXPExpressionEvaluatorScopeProvider, AXPExpressionEvaluatorScopeProviderContext } from '@acorex-platform/framework-shared/core';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { inject } from '@angular/core';\nimport { defaultTo, isEmpty, isString, uniq } from 'lodash';\nimport { RootConfig } from '@acorex-platform/module-project-management-client/contracts';\nimport type { AXMProjectManagementProjectEntityModel } from '@acorex-platform/module-project-management-client/contracts';\nimport type { AXMProjectManagementProjectTypeEntityModel } from '@acorex-platform/module-project-management-client/contracts';\n\n//#endregion\n\n/**\n * Expression-evaluator scope for resolving allowed document type names from a project record.\n * Unions document type names configured on each allowed TaskType for the project's ProjectType.\n */\nexport class AXMProjectManagementDocumentTypeNamesExpressionEvaluatorScopeProvider\n implements AXPExpressionEvaluatorScopeProvider {\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n\n //#endregion\n\n //#region ---- AXPExpressionEvaluatorScopeProvider ----\n\n async provide(context: AXPExpressionEvaluatorScopeProviderContext): Promise<void> {\n context.addScope(RootConfig.module.name, {\n resolveDocumentTypeNames: async (projectIdRaw?: unknown): Promise<string[]> => {\n try {\n const projectId = isString(projectIdRaw) ? projectIdRaw.trim() : '';\n if (!projectId) {\n return [];\n }\n\n return await this.loadAllowedDocumentTypeNamesForProject(projectId);\n } catch (error: unknown) {\n console.error(\n `${RootConfig.module.name}.resolveDocumentTypeNames failed:`,\n error instanceof Error ? error.message : error,\n );\n return [];\n }\n },\n });\n }\n\n //#endregion\n\n //#region ---- Helpers ----\n\n private async loadAllowedDocumentTypeNamesForProject(projectId: string): Promise<string[]> {\n const project = (await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.project.name)\n .data()\n .byKey(projectId)) as AXMProjectManagementProjectEntityModel | null;\n\n if (!project) {\n return [];\n }\n\n const projectTypeId = this.resolveProjectTypeId(project);\n if (!projectTypeId) {\n return [];\n }\n\n const projectType = (await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.projectType.name)\n .data()\n .byKey(projectTypeId)) as AXMProjectManagementProjectTypeEntityModel | null;\n\n if (!projectType) {\n return [];\n }\n\n const taskTypeIds = this.resolveAllowedTaskTypeIds(projectType);\n if (isEmpty(taskTypeIds)) {\n return [];\n }\n\n const names: string[] = [];\n for (const taskTypeId of taskTypeIds) {\n const trimmedId = taskTypeId?.trim();\n if (!trimmedId) {\n continue;\n }\n\n const taskType = (await this.entityService\n .withEntity('TaskManagement', 'TaskType')\n .data()\n .byKey(trimmedId)) as AXMTaskManagementTaskTypeEntityModel | null;\n\n if (!taskType?.isActive) {\n continue;\n }\n\n names.push(...this.extractDocumentTypeNames(taskType));\n }\n\n return uniq(names.filter((name) => name.trim().length > 0));\n }\n\n private resolveProjectTypeId(project: AXMProjectManagementProjectEntityModel): string {\n const fromNested = project.projectType?.id;\n if (isString(fromNested) && fromNested.trim()) {\n return fromNested.trim();\n }\n\n const raw = project.projectTypeId as unknown;\n if (isString(raw) && raw.trim()) {\n return raw.trim();\n }\n if (raw && typeof raw === 'object' && isString((raw as { id?: string }).id)) {\n return ((raw as { id: string }).id ?? '').trim();\n }\n return '';\n }\n\n private resolveAllowedTaskTypeIds(projectType: AXMProjectManagementProjectTypeEntityModel): string[] {\n const fromRefs = projectType.allowedTaskTypes?.map((row) => row.id).filter(Boolean) ?? [];\n if (!isEmpty(fromRefs)) {\n return fromRefs;\n }\n return defaultTo(projectType.allowedTaskTypeIds, []).filter((id) => isString(id) && id.trim().length > 0);\n }\n\n private extractDocumentTypeNames(taskType: AXMTaskManagementTaskTypeEntityModel): string[] {\n return (taskType.documentTypes ?? [])\n .map((row) => row?.name)\n .filter((name): name is string => isString(name) && name.trim().length > 0)\n .map((name) => name.trim());\n }\n\n //#endregion\n}\n","import { AXP_MODULE_MANIFEST_PROVIDER, AXP_CATALOG_SCOPE_DEFINITION_PROVIDER, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER } from '@acorex-platform/framework-client/core';\nimport { NgModule } from '@angular/core';\nimport { ProjectManagementManifest } from './manifest';\nimport { AXPRuntimeModule } from '@acorex-platform/framework-client/runtime';\nimport { AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER, AXP_STATUS_PROVIDERS } from '@acorex-platform/framework-client/common';\nimport { AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/auth';\nimport { AXP_ENTITY_MODIFIER } from '@acorex-platform/framework-client/layout/entity';\nimport { AXMPermissionDefinitionProvider } from './permission-definition.provider';\nimport { AXMMenuProvider } from './menu.provider';\n\nimport { AXMSettingProvider } from './setting.provider';\nimport { AXMSearchCommandProvider } from './search-command.provider';\nimport { AXMProjectStatusProvider } from './features/project/project-status.provider';\nimport { AXMProjectDefaultTypeEntityModifier } from './features/project/project-default-type.entity-modifier';\nimport { AXMProjectManagementCatalogScopeDefinitionProvider } from './catalog-scope-definition.provider';\nimport { AXMProjectManagementAllowedTaskTypesExpressionEvaluatorScopeProvider } from './features/shared/allowed-task-types-expression-evaluator-scope.provider';\nimport { AXMProjectManagementDocumentTypeNamesExpressionEvaluatorScopeProvider } from './features/shared/document-type-names-expression-evaluator-scope.provider';\n\n@NgModule({\n imports: [\n AXPRuntimeModule,\n ],\n exports: [],\n declarations: [],\n providers: [\n\n {\n provide: AXP_MODULE_MANIFEST_PROVIDER,\n useValue: ProjectManagementManifest,\n multi: true,\n },\n {\n provide: AXP_PERMISSION_DEFINITION_PROVIDER,\n useClass: AXMPermissionDefinitionProvider,\n multi: true,\n },\n {\n provide: AXP_MENU_PROVIDER,\n useClass: AXMMenuProvider,\n multi: true,\n },\n \n {\n provide: AXP_SETTING_DEFINITION_PROVIDER,\n useClass: AXMSettingProvider,\n multi: true,\n },\n {\n provide: AXP_SEARCH_PROVIDER,\n useClass: AXMSearchCommandProvider,\n multi: true,\n },\n {\n provide: AXP_STATUS_PROVIDERS,\n useClass: AXMProjectStatusProvider,\n multi: true,\n },\n {\n provide: AXP_CATALOG_SCOPE_DEFINITION_PROVIDER,\n useClass: AXMProjectManagementCatalogScopeDefinitionProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXMProjectManagementAllowedTaskTypesExpressionEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,\n useClass: AXMProjectManagementDocumentTypeNamesExpressionEvaluatorScopeProvider,\n multi: true,\n },\n {\n provide: AXP_ENTITY_MODIFIER,\n useValue: AXMProjectDefaultTypeEntityModifier,\n multi: true,\n },\n ],\n})\nexport class AXMProjectManagementModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA;AAKA;AAEA;AAEA;;;AAGG;AACI,MAAM,yBAAyB,GAAsB;AAC1D,IAAA,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI;AAC5B,IAAA,OAAO,EAAE,OAAO;AAChB,IAAA,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK;AAC9B,IAAA,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI;AAC5B,IAAA,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI;AAE5B,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,MAAM,EAAE,oBAAoB;;CAE7B;AAED;;ACVA;AAEA;AAEA;;AAEG;MAEU,+BAA+B,CAAA;IAC1C,MAAM,MAAM,CAAC,OAA+C,EAAA;QAC1D,MAAM,IAAI,GAAG,6BAA6B;QAC1C,MAAM,MAAM,GAAG,4BAA4B;QAC3C,MAAM,CAAC,GAAG,mCAAmC;QAC7C,MAAM,CAAC,GAAG,2BAA2B;QAErC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAA,EAAG,CAAC,sBAAsB,EAAE,CAAA,EAAG,CAAC,CAAA,0BAAA,CAA4B,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAEvH;AACG,aAAA,QAAQ,CACP,MAAM,CAAC,YAAY,CAAC,QAAQ,EAC5B,CAAA,EAAG,CAAC,CAAA,6BAAA,CAA+B,EACnC,CAAA,EAAG,CAAC,CAAA,mCAAA,CAAqC,EACzC,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;AAEhD,aAAA,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,CAAA,EAAG,CAAC,CAAA,aAAA,CAAe,EAAE,CAAA,EAAG,CAAC,CAAA,mBAAA,CAAqB;AACzE,aAAA,aAAa;AACb,aAAA,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAA,EAAG,CAAC,CAAA,wBAAA,CAA0B,EAAE,CAAA,EAAG,CAAC,CAAA,8BAAA,CAAgC;AACzG,aAAA,aAAa;AACb,aAAA,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA,EAAG,CAAC,CAAA,YAAA,CAAc,EAAE,CAAA,EAAG,CAAC,CAAA,kBAAA,CAAoB;AACtE,aAAA,aAAa;AACb,aAAA,QAAQ,EAAE;IACf;8GAvBW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAA/B,+BAA+B,EAAA,CAAA,CAAA;;2FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAD3C;;;MCVY,eAAe,CAAA;AAA5B,IAAA,WAAA,GAAA;AACU,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAoClD;IAlCE,MAAM,OAAO,CAAC,OAA+B,EAAA;AAC3C,QAAA,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM;QAChC,MAAM,IAAI,GAAG,6BAA6B;QAE1C,OAAO,CAAC,QAAQ,CAAC;AACf,YAAA;gBACE,IAAI,EAAE,4BAA4B,CAAC,IAAI;AACvC,gBAAA,QAAQ,EAAE,IAAI;AACd,gBAAA,IAAI,EAAE,2CAA2C;AACjD,gBAAA,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;AAClF,gBAAA,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI;AACtC,gBAAA,MAAM,EAAE;AACN,oBAAA,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;AACvB,oBAAA,WAAW,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACrC,iBAAA;AACF,aAAA;AACF,SAAA,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC;AAChD,YAAA;gBACE,IAAI,EAAE,4BAA4B,CAAC,YAAY;AAC/C,gBAAA,IAAI,EAAE,mDAAmD;AACzD,gBAAA,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI;AAC1C,gBAAA,QAAQ,EAAE,CAAC;gBACX,IAAI,EAAE,IAAI,CAAC;AACR,qBAAA,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI;AAC5D,qBAAA,UAAU,EAAE;AACf,gBAAA,MAAM,EAAE;AACN,oBAAA,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;AACvB,oBAAA,WAAW,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;AAC1B,iBAAA;AACF,aAAA;AACF,SAAA,CAAC;IACJ;AACD;;MC/CY,kBAAkB,CAAA;IAC7B,MAAM,OAAO,CAAC,OAA4C,EAAA;;;;;;;;;;;;;;;;;;;;;;;;IAwB1D;AACD;;ACzBK,MAAO,wBAAyB,SAAQ,wBAAwB,CAAA;AAAtE,IAAA,WAAA,GAAA;;AACE,QAAA,IAAA,CAAA,QAAQ,GAAG;AACT,YAAA,yBAAyB,CAAC;AACxB,gBAAA,EAAE,EAAE,gBAAgB;AACpB,gBAAA,SAAS,EAAE,CAAA,EAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAA,CAAA,EAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAA,CAAE;AAC1E,gBAAA,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE;AAChI,gBAAA,QAAQ,EAAE,mEAAmE;AAC7E,gBAAA,cAAc,EAAE,yEAAyE;AACzF,gBAAA,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI;aACvC,CAAC;AACF,YAAA,yBAAyB,CAAC;AACxB,gBAAA,EAAE,EAAE,qBAAqB;AACzB,gBAAA,SAAS,EAAE,CAAA,EAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAA,CAAA,EAAI,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAA,CAAE;AAC9E,gBAAA,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE;AACxI,gBAAA,QAAQ,EAAE,wEAAwE;AAClF,gBAAA,cAAc,EAAE,8EAA8E;AAC9F,gBAAA,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI;aAC3C,CAAC;SACH;IACH;AAAC;;ACtBD;AAIA;AAEA;AAEA;;AAEG;AACH,MAAM,MAAM,GAAG,CACb,IAAY,EACZ,KAAa,EACb,KAAa,EACb,OAAA,GAAwC,EAAE,MACjB;IACzB,IAAI;IACJ,KAAK;IACL,KAAK;AACL,IAAA,GAAG,OAAO;AACX,CAAA,CAAC;AAEI,MAAO,wBAAyB,SAAQ,iBAAiB,CAAA;AAA/D,IAAA,WAAA,GAAA;;QACW,IAAA,CAAA,GAAG,GAAG,yCAAyC;AAE/C,QAAA,IAAA,CAAA,QAAQ,GAA0B;AACzC,YAAA,MAAM,CAAC,SAAS,EAAE,kEAAkE,EAAE,SAAS,EAAE;AAC/F,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,IAAI,EAAE,wBAAwB;aAC/B,CAAC;AACF,YAAA,MAAM,CAAC,aAAa,EAAE,kEAAkE,EAAE,SAAS,EAAE;AACnG,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,IAAI,EAAE,qBAAqB;aAC5B,CAAC;AACF,YAAA,MAAM,CAAC,WAAW,EAAE,iEAAiE,EAAE,SAAS,EAAE;AAChG,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,IAAI,EAAE,0BAA0B;aACjC,CAAC;AACF,YAAA,MAAM,CAAC,UAAU,EAAE,kEAAkE,EAAE,QAAQ,EAAE;AAC/F,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,YAAY,EAAE,IAAI;AAClB,gBAAA,OAAO,EAAE,IAAI;AACb,gBAAA,IAAI,EAAE,yBAAyB;aAChC,CAAC;SACH;AAEQ,QAAA,IAAA,CAAA,WAAW,GAA0B;AAC5C,YAAA;AACE,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,EAAE,EAAE,aAAa;AACjB,gBAAA,KAAK,EAAE,4EAA4E;AACpF,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,EAAE,EAAE,WAAW;AACf,gBAAA,KAAK,EAAE,sEAAsE;AAC9E,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,WAAW;AACjB,gBAAA,EAAE,EAAE,UAAU;AACd,gBAAA,KAAK,EAAE,uEAAuE;AAC/E,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,EAAE,EAAE,SAAS;AACb,gBAAA,KAAK,EAAE,2EAA2E;AACnF,aAAA;SACF;QAEQ,IAAA,CAAA,aAAa,GAAG,SAAS;IACpC;AAAC;AAED;;AC9EA;AAUA;AAEA;AAEA;;;AAGG;AACH,MAAM,gCAAgC,GACpC,yDAAyD;AAE3D,MAAM,yBAAyB,GAAG,CAAA,iBAAA,EAAoB,gCAAgC,OAAO;AAE7F;AACA,MAAM,kBAAkB,GAAG,4BAA4B;AAEvD,MAAM,mBAAmB,GAAG,qBAAqB;AAEjD;AAEA;AAEA,SAAS,iBAAiB,CAAC,MAA6B,EAAA;AACtD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;AAC9B,IAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/B,QAAA,OAAO,OAAO;IAChB;IACA,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,IAAI,OAAO,EAAE;AAC/D,QAAA,OAAO,MAAM,CAAE,OAA4B,CAAC,IAAI,CAAC;IACnD;AACA,IAAA,OAAO,SAAS;AAClB;AAEA;AAEA;AAEA;;;;;AAKG;AACI,MAAM,mCAAmC,GAA8B;AAC5E,IAAA,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI;AAC5C,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,QAAQ,EAAE,CAAC,GAAG,KAAI;AAChB,QAAA,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE;YAC/C;QACF;QAEA,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC;AACvD,QAAA,IAAI,UAAU,CAAC,GAAG,EAAE,EAAE;YACpB,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM;AAC3B,gBAAA,GAAG,IAAI;AACP,gBAAA,MAAM,EAAE;oBACN,GAAG,IAAI,CAAC,MAAM;AACd,oBAAA,YAAY,EAAE,yBAAyB;AACxC,iBAAA;AACF,aAAA,CAAC,CAAC;QACL;QAEA,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9C,QAAA,IAAI,UAAU,CAAC,GAAG,EAAE,EAAE;AACpB,YAAA,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACzB,gBAAA,MAAM,gBAAgB,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE;gBACvE,OAAQ,gBAA2C,CAAC,QAAQ;gBAE5D,OAAO;AACL,oBAAA,GAAG,IAAI;AACP,oBAAA,MAAM,EAAE;wBACN,GAAG,IAAI,CAAC,MAAM;AACd,wBAAA,QAAQ,EAAE,kBAAkB;AAC5B,wBAAA,SAAS,EAAE;AACT,4BAAA,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS;AACzB,4BAAA,OAAO,EAAE,gBAAgB;AAC1B,yBAAA;AACF,qBAAA;iBACF;AACH,YAAA,CAAC,CAAC;QACJ;QAEA,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE;AAChD,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,mBAAmB,CAAC;QACzE,IAAI,CAAC,WAAW,EAAE;YAChB;QACF;AAEA,QAAA,MAAM,YAAY,GAAG,yBAAyB,EAAE;AAChD,QAAA,MAAM,aAAa,GAAG,iBAAiB,CAAC,YAAY,CAAC;QACrD,MAAM,SAAS,GAAG,CAAC,WAAW,CAAC,OAAO,IAAI,EAAE,EAAE,IAAI,CAChD,CAAC,MAAM,KAAK,iBAAiB,CAAC,MAAM,CAAC,KAAK,aAAa,CACxD;QACD,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,WAAW,CAAC,OAAO,GAAG,CAAC,IAAI,WAAW,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,YAAY,CAAC;QACtE;IACF,CAAC;CACF;AAED;;ACvGA;AAEA;AAEA,MAAM,mBAAmB,GAAG,uCAAuC;AAEnE;AAEA;MAGa,kDAAkD,CAAA;AAC7D,IAAA,MAAM,KAAK,GAAA;QACT,OAAO;AACL,YAAA;AACE,gBAAA,IAAI,EAAE,gBAAgB;AACtB,gBAAA,KAAK,EAAE,6CAA6C;AACpD,gBAAA,WAAW,EAAE,mDAAmD;gBAChE,OAAO,EAAE,CAAC,mBAAmB,CAAC;AAC9B,gBAAA,IAAI,EAAE,6BAA6B;AACnC,gBAAA,QAAQ,EAAE,2BAA2B;AACrC,gBAAA,KAAK,EAAE,EAAE;AACV,aAAA;SACF;IACH;8GAbW,kDAAkD,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAAlD,kDAAkD,EAAA,CAAA,CAAA;;2FAAlD,kDAAkD,EAAA,UAAA,EAAA,CAAA;kBAD9D;;;AChBD;AA0BA;AAEA;;AAEG;MACU,oEAAoE,CAAA;AAAjF,IAAA,WAAA,GAAA;;AAImB,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;;IAkI3D;;;IA5HE,MAAM,OAAO,CAAC,OAAmD,EAAA;QAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE;AACvC,YAAA,gBAAgB,EAAE,OAAO,gBAA0B,KAAgC;AACjF,gBAAA,IAAI;AACF,oBAAA,MAAM,aAAa,GAAG,OAAO,gBAAgB,KAAK,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE;oBACzF,IAAI,CAAC,aAAa,EAAE;AAClB,wBAAA,OAAO,EAAE;oBACX;oBAEA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC;AAClE,oBAAA,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;AACxB,wBAAA,OAAO,EAAE;oBACX;AAEA,oBAAA,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;gBACxD;gBAAE,OAAO,KAAc,EAAE;oBACvB,OAAO,CAAC,KAAK,CACX,CAAA,EAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAA,yBAAA,CAA2B,EACpD,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAC/C;AACD,oBAAA,OAAO,EAAE;gBACX;YACF,CAAC;AACF,SAAA,CAAC;IACJ;;;IAMQ,MAAM,oBAAoB,CAAC,aAAqB,EAAA;AACtD,QAAA,MAAM,WAAW,IAAI,MAAM,IAAI,CAAC;AAC7B,aAAA,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI;AACvE,aAAA,IAAI;AACJ,aAAA,KAAK,CAAC,aAAa,CAAC,CAAsD;QAE7E,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,OAAO,EAAE;QACX;QAEA,MAAM,WAAW,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC;QAC/D,MAAM,QAAQ,GAAyB,EAAE;AAEzC,QAAA,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;AACpC,YAAA,MAAM,SAAS,GAAG,UAAU,EAAE,IAAI,EAAE;YACpC,IAAI,CAAC,SAAS,EAAE;gBACd;YACF;AACA,YAAA,MAAM,cAAc,IAAI,MAAM,IAAI,CAAC;AAChC,iBAAA,UAAU,CAAC,gBAAgB,EAAE,UAAU;AACvC,iBAAA,IAAI;AACJ,iBAAA,KAAK,CAAC,SAAS,CAAC,CAAgD;AACnE,YAAA,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE;gBAC7B;YACF;YACA,QAAQ,CAAC,IAAI,CAAC;AACZ,gBAAA,UAAU,EAAE,SAAS;gBACrB,aAAa;AACb,gBAAA,cAAc,EAAE;oBACd,EAAE,EAAE,cAAc,CAAC,EAAE;oBACrB,KAAK,EAAE,cAAc,CAAC,KAAK;oBAC3B,cAAc,EAAE,cAAc,CAAC,cAAc;oBAC7C,QAAQ,EAAE,cAAc,CAAC,QAAQ;AAClC,iBAAA;AACF,aAAA,CAAC;QACJ;AAEA,QAAA,OAAO,QAAQ;IACjB;AAEQ,IAAA,yBAAyB,CAAC,WAAuD,EAAA;QACvF,MAAM,QAAQ,GAAG,WAAW,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;AACzF,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AACtB,YAAA,OAAO,QAAQ;QACjB;AACA,QAAA,OAAO,SAAS,CAAC,WAAW,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACrH;AAEQ,IAAA,WAAW,CAAC,GAAuB,EAAA;AACzC,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU;QACjC,MAAM,aAAa,GAAG,GAAG,CAAC,cAAc,EAAE,KAAK,IAAI,UAAU;AAC7D,QAAA,MAAM,cAAc,GAAG,GAAG,CAAC,cAAc,EAAE,cAAc;QACzD,MAAM,UAAU,GAAG,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE;QAEvD,MAAM,iBAAiB,GAAG;AACxB,cAAG;AACD,gBAAA,IAAI,EAAE,4BAA4B,CAAC,IAAI,CAAC,SAAS;AACjD,gBAAA,OAAO,EAAE;oBACP,UAAU;oBACV,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE;wBACxD,UAAU;wBACV,aAAa;wBACb,aAAa,EAAE,GAAG,CAAC,aAAa;AAChC,wBAAA,UAAU,EAAE;AACV,4BAAA,IAAI,EAAE,wBAAwB;AAC9B,4BAAA,EAAE,EAAE,0BAA0B;AAC9B,4BAAA,KAAK,EAAE,6BAA6B;AACrC,yBAAA;qBACF,CAAC;AACH,iBAAA;AACoC;cACrC,SAAS;AAEb,QAAA,MAAM,oBAAoB,GAAG;AAC3B,YAAA,IAAI,EAAE,8BAA8B;AACpC,YAAA,OAAO,EAAE;AACP,gBAAA,OAAO,EAAE,gEAAgE;AACzE,gBAAA,IAAI,EAAE,SAAS;AAChB,aAAA;SACmC;QAEtC,OAAO;YACL,IAAI,EAAE,CAAA,mBAAA,EAAsB,UAAU,CAAA,CAAE;AACxC,YAAA,KAAK,EAAE,aAAa;AACpB,YAAA,IAAI,EAAE,kBAAkB;AACxB,YAAA,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,iBAAiB,IAAI,oBAAoB;AAClD,YAAA,QAAQ,EAAE,SAAS;AACnB,YAAA,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,qBAAqB,CAAC,SAAS;SACb;IAC7B;AAGD;;ACrKD;AAWA;AAEA;;;AAGG;MACU,qEAAqE,CAAA;AAAlF,IAAA,WAAA,GAAA;;AAImB,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;;IAkH3D;;;IA5GE,MAAM,OAAO,CAAC,OAAmD,EAAA;QAC/D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE;AACvC,YAAA,wBAAwB,EAAE,OAAO,YAAsB,KAAuB;AAC5E,gBAAA,IAAI;AACF,oBAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE;oBACnE,IAAI,CAAC,SAAS,EAAE;AACd,wBAAA,OAAO,EAAE;oBACX;AAEA,oBAAA,OAAO,MAAM,IAAI,CAAC,sCAAsC,CAAC,SAAS,CAAC;gBACrE;gBAAE,OAAO,KAAc,EAAE;oBACvB,OAAO,CAAC,KAAK,CACX,CAAA,EAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAA,iCAAA,CAAmC,EAC5D,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAC/C;AACD,oBAAA,OAAO,EAAE;gBACX;YACF,CAAC;AACF,SAAA,CAAC;IACJ;;;IAMQ,MAAM,sCAAsC,CAAC,SAAiB,EAAA;AACpE,QAAA,MAAM,OAAO,IAAI,MAAM,IAAI,CAAC;AACzB,aAAA,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI;AACnE,aAAA,IAAI;AACJ,aAAA,KAAK,CAAC,SAAS,CAAC,CAAkD;QAErE,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,EAAE;QACX;QAEA,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;QACxD,IAAI,CAAC,aAAa,EAAE;AAClB,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,WAAW,IAAI,MAAM,IAAI,CAAC;AAC7B,aAAA,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI;AACvE,aAAA,IAAI;AACJ,aAAA,KAAK,CAAC,aAAa,CAAC,CAAsD;QAE7E,IAAI,CAAC,WAAW,EAAE;AAChB,YAAA,OAAO,EAAE;QACX;QAEA,MAAM,WAAW,GAAG,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC;AAC/D,QAAA,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE;AACxB,YAAA,OAAO,EAAE;QACX;QAEA,MAAM,KAAK,GAAa,EAAE;AAC1B,QAAA,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;AACpC,YAAA,MAAM,SAAS,GAAG,UAAU,EAAE,IAAI,EAAE;YACpC,IAAI,CAAC,SAAS,EAAE;gBACd;YACF;AAEA,YAAA,MAAM,QAAQ,IAAI,MAAM,IAAI,CAAC;AAC1B,iBAAA,UAAU,CAAC,gBAAgB,EAAE,UAAU;AACvC,iBAAA,IAAI;AACJ,iBAAA,KAAK,CAAC,SAAS,CAAC,CAAgD;AAEnE,YAAA,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE;gBACvB;YACF;YAEA,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QACxD;QAEA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7D;AAEQ,IAAA,oBAAoB,CAAC,OAA+C,EAAA;AAC1E,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,EAAE;QAC1C,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE;AAC7C,YAAA,OAAO,UAAU,CAAC,IAAI,EAAE;QAC1B;AAEA,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,aAAwB;QAC5C,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE;AAC/B,YAAA,OAAO,GAAG,CAAC,IAAI,EAAE;QACnB;AACA,QAAA,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,CAAE,GAAuB,CAAC,EAAE,CAAC,EAAE;YAC3E,OAAO,CAAE,GAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE;QAClD;AACA,QAAA,OAAO,EAAE;IACX;AAEQ,IAAA,yBAAyB,CAAC,WAAuD,EAAA;QACvF,MAAM,QAAQ,GAAG,WAAW,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE;AACzF,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AACtB,YAAA,OAAO,QAAQ;QACjB;AACA,QAAA,OAAO,SAAS,CAAC,WAAW,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3G;AAEQ,IAAA,wBAAwB,CAAC,QAA8C,EAAA;AAC7E,QAAA,OAAO,CAAC,QAAQ,CAAC,aAAa,IAAI,EAAE;aACjC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,IAAI;AACtB,aAAA,MAAM,CAAC,CAAC,IAAI,KAAqB,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;aACzE,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B;AAGD;;MCxDY,0BAA0B,CAAA;8GAA1B,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAA1B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,YA3DnC,gBAAgB,CAAA,EAAA,CAAA,CAAA;AA2DP,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,EAAA,SAAA,EAvD1B;AAET,YAAA;AACE,gBAAA,OAAO,EAAE,4BAA4B;AACrC,gBAAA,QAAQ,EAAE,yBAAyB;AACnC,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,kCAAkC;AAC3C,gBAAA,QAAQ,EAAE,+BAA+B;AACzC,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,QAAQ,EAAE,eAAe;AACzB,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AAED,YAAA;AACE,gBAAA,OAAO,EAAE,+BAA+B;AACxC,gBAAA,QAAQ,EAAE,kBAAkB;AAC5B,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,mBAAmB;AAC5B,gBAAA,QAAQ,EAAE,wBAAwB;AAClC,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,oBAAoB;AAC7B,gBAAA,QAAQ,EAAE,wBAAwB;AAClC,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,qCAAqC;AAC9C,gBAAA,QAAQ,EAAE,kDAAkD;AAC5D,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,uCAAuC;AAChD,gBAAA,QAAQ,EAAE,oEAAoE;AAC9E,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,uCAAuC;AAChD,gBAAA,QAAQ,EAAE,qEAAqE;AAC/E,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACD,YAAA;AACE,gBAAA,OAAO,EAAE,mBAAmB;AAC5B,gBAAA,QAAQ,EAAE,mCAAmC;AAC7C,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,OAAA,EAAA,CAzDC,gBAAgB,CAAA,EAAA,CAAA,CAAA;;2FA2DP,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBA7DtC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,gBAAgB;AACjB,qBAAA;AACD,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,SAAS,EAAE;AAET,wBAAA;AACE,4BAAA,OAAO,EAAE,4BAA4B;AACrC,4BAAA,QAAQ,EAAE,yBAAyB;AACnC,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,kCAAkC;AAC3C,4BAAA,QAAQ,EAAE,+BAA+B;AACzC,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,QAAQ,EAAE,eAAe;AACzB,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AAED,wBAAA;AACE,4BAAA,OAAO,EAAE,+BAA+B;AACxC,4BAAA,QAAQ,EAAE,kBAAkB;AAC5B,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,mBAAmB;AAC5B,4BAAA,QAAQ,EAAE,wBAAwB;AAClC,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,oBAAoB;AAC7B,4BAAA,QAAQ,EAAE,wBAAwB;AAClC,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,qCAAqC;AAC9C,4BAAA,QAAQ,EAAE,kDAAkD;AAC5D,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,uCAAuC;AAChD,4BAAA,QAAQ,EAAE,oEAAoE;AAC9E,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,uCAAuC;AAChD,4BAAA,QAAQ,EAAE,qEAAqE;AAC/E,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACD,wBAAA;AACE,4BAAA,OAAO,EAAE,mBAAmB;AAC5B,4BAAA,QAAQ,EAAE,mCAAmC;AAC7C,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA;AACF,iBAAA;;;AC9ED;;AAEG;;;;"}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@acorex-platform/module-project-management-client",
|
|
3
|
+
"version": "0.0.21",
|
|
4
|
+
"sideEffects": false,
|
|
5
|
+
"peerDependencies": {
|
|
6
|
+
"@angular/common": "^21.0.0",
|
|
7
|
+
"@angular/core": "^21.0.0"
|
|
8
|
+
},
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"tslib": "^2.3.0"
|
|
11
|
+
},
|
|
12
|
+
"module": "fesm2022/acorex-platform-module-project-management-client.mjs",
|
|
13
|
+
"typings": "types/acorex-platform-module-project-management-client.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
"./package.json": {
|
|
16
|
+
"default": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./types/acorex-platform-module-project-management-client.d.ts",
|
|
20
|
+
"default": "./fesm2022/acorex-platform-module-project-management-client.mjs"
|
|
21
|
+
},
|
|
22
|
+
"./contracts": {
|
|
23
|
+
"types": "./types/acorex-platform-module-project-management-client-contracts.d.ts",
|
|
24
|
+
"default": "./fesm2022/acorex-platform-module-project-management-client-contracts.mjs"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"type": "module"
|
|
28
|
+
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { AXPEntityModel } from '@acorex-platform/framework-shared/entity';
|
|
2
|
+
import { AXPSystemStatuses, AXPIntegrationReference, AXPCategoryListItem } from '@acorex-platform/framework-shared/core';
|
|
3
|
+
import { AXMMetaDataBuilderValue } from '@acorex-platform/module-data-management-contracts';
|
|
4
|
+
|
|
5
|
+
/** Catalog scope for project-management workflows and related catalogs. */
|
|
6
|
+
declare const PM_CATALOG_SCOPE = "project-management.pm";
|
|
7
|
+
/** Canonical entity source for {@link AXPEntityReference.type} on project subjects. */
|
|
8
|
+
declare const PM_PROJECT_ENTITY_SOURCE = "ProjectManagement.Project";
|
|
9
|
+
|
|
10
|
+
declare const AXPProjectManagementMenuKeys: {
|
|
11
|
+
readonly Root: "project-management:menu";
|
|
12
|
+
readonly Projects: "project-management:menu:projects";
|
|
13
|
+
readonly ProjectTypes: "project-management:menu:project-types";
|
|
14
|
+
readonly Tasks: "project-management:menu:tasks";
|
|
15
|
+
readonly TaskTypes: "project-management:menu:task-types";
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Projects & Work capabilities used by this module.
|
|
20
|
+
* Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).
|
|
21
|
+
*/
|
|
22
|
+
declare const AXPProjectsWorkPermissionKeys: {
|
|
23
|
+
readonly Access: "ProjectsWork:Permission:Access";
|
|
24
|
+
readonly MaintainProjects: "ProjectsWork:Permission:MaintainProjects";
|
|
25
|
+
readonly MaintainTasks: "ProjectsWork:Permission:MaintainTasks";
|
|
26
|
+
readonly ViewAllTasks: "ProjectsWork:Permission:ViewAllTasks";
|
|
27
|
+
readonly MaintainTimesheets: "ProjectsWork:Permission:MaintainTimesheets";
|
|
28
|
+
readonly ManageTimesheetActions: "ProjectsWork:Permission:ManageTimesheetActions";
|
|
29
|
+
readonly ViewTimesheetReports: "ProjectsWork:Permission:ViewTimesheetReports";
|
|
30
|
+
readonly Setup: "ProjectsWork:Permission:Setup";
|
|
31
|
+
};
|
|
32
|
+
/** @deprecated Prefer {@link AXPProjectsWorkPermissionKeys}. */
|
|
33
|
+
declare const AXMPermissionsKeys: {
|
|
34
|
+
readonly ProjectManagement: {
|
|
35
|
+
readonly Management: "ProjectsWork:Permission:Access";
|
|
36
|
+
readonly Project: {
|
|
37
|
+
readonly Management: "ProjectsWork:Permission:MaintainProjects";
|
|
38
|
+
};
|
|
39
|
+
readonly ProjectType: {
|
|
40
|
+
readonly Management: "ProjectsWork:Permission:Setup";
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
declare const RootConfig: {
|
|
46
|
+
readonly config: {
|
|
47
|
+
i18n: string;
|
|
48
|
+
module: string;
|
|
49
|
+
};
|
|
50
|
+
readonly module: {
|
|
51
|
+
readonly module: "ProjectManagement";
|
|
52
|
+
readonly name: "ProjectManagement";
|
|
53
|
+
readonly title: `@${string}:module.title`;
|
|
54
|
+
readonly icon: "fa-light fa-clipboard-list-check";
|
|
55
|
+
};
|
|
56
|
+
readonly entities: {
|
|
57
|
+
readonly projectTypeRoleType: {
|
|
58
|
+
readonly name: "ProjectTypeRoleType";
|
|
59
|
+
readonly title: "@project-management:projects.project-type-role-types.title";
|
|
60
|
+
readonly titlePlural: "@project-management:projects.project-type-role-types.plural";
|
|
61
|
+
readonly icon: "fa-light fa-user";
|
|
62
|
+
};
|
|
63
|
+
readonly projectMember: {
|
|
64
|
+
readonly name: "ProjectMember";
|
|
65
|
+
readonly title: "@project-management:projects.project-members.title";
|
|
66
|
+
readonly titlePlural: "@project-management:projects.project-members.plural";
|
|
67
|
+
readonly icon: "fa-light fa-users";
|
|
68
|
+
};
|
|
69
|
+
readonly projectType: {
|
|
70
|
+
readonly name: "ProjectType";
|
|
71
|
+
readonly title: "@project-management:projects.project-types.title";
|
|
72
|
+
readonly titlePlural: "@project-management:projects.project-types.plural";
|
|
73
|
+
readonly icon: "fa-light fa-rectangle-vertical-history";
|
|
74
|
+
};
|
|
75
|
+
readonly projectTypeCategory: {
|
|
76
|
+
readonly name: "ProjectTypeCategory";
|
|
77
|
+
readonly title: "@project-management:projects.project-type-categories.title";
|
|
78
|
+
readonly titlePlural: "@project-management:projects.project-type-categories.plural";
|
|
79
|
+
readonly icon: "fa-light fa-layer-group";
|
|
80
|
+
};
|
|
81
|
+
readonly project: {
|
|
82
|
+
readonly name: "Project";
|
|
83
|
+
readonly source: `${string}.Project`;
|
|
84
|
+
readonly title: "@project-management:projects.terms.title";
|
|
85
|
+
readonly titlePlural: "@project-management:projects.terms.plural";
|
|
86
|
+
readonly icon: "fa-light fa-square-kanban";
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
readonly queries: {
|
|
90
|
+
readonly dashboard: {
|
|
91
|
+
readonly activeProjectsKpi: `${string}:Dashboard:ActiveProjectsKpi`;
|
|
92
|
+
readonly projectsByStatusBar: `${string}:Dashboard:ProjectsByStatusBar`;
|
|
93
|
+
readonly projectsTasksCountBar: `${string}:Dashboard:ProjectsTasksCountBar`;
|
|
94
|
+
readonly customersProjectsCountBar: `${string}:Dashboard:CustomersProjectsCountBar`;
|
|
95
|
+
};
|
|
96
|
+
readonly reports: {
|
|
97
|
+
readonly getProjectsByStatus: `${string}:Reports:GetProjectsByStatus`;
|
|
98
|
+
readonly getMemberWorkload: `${string}:Reports:GetMemberWorkload`;
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
type AXMProjectmanagementProjectStatus = typeof AXPSystemStatuses.Draft.name | typeof AXPSystemStatuses.Active.name | typeof AXPSystemStatuses.Inactive.name | typeof AXPSystemStatuses.Archived.name;
|
|
104
|
+
interface AXMProjectManagementProjectEntityModel extends AXPEntityModel<string> {
|
|
105
|
+
code: string;
|
|
106
|
+
title: string;
|
|
107
|
+
description?: string;
|
|
108
|
+
startDate?: string | Date;
|
|
109
|
+
endDate?: string | Date;
|
|
110
|
+
dueDate?: string | Date;
|
|
111
|
+
actualStartDate?: string | Date;
|
|
112
|
+
actualEndDate?: string | Date;
|
|
113
|
+
projectTypeId: string;
|
|
114
|
+
projectType?: {
|
|
115
|
+
id: string;
|
|
116
|
+
title?: string;
|
|
117
|
+
};
|
|
118
|
+
projectStatusId?: AXMProjectmanagementProjectStatus | string;
|
|
119
|
+
projectStatus?: AXMProjectmanagementProjectStatus | {
|
|
120
|
+
id: string;
|
|
121
|
+
title?: string;
|
|
122
|
+
};
|
|
123
|
+
customerId?: string;
|
|
124
|
+
customer?: {
|
|
125
|
+
id: string;
|
|
126
|
+
title?: string;
|
|
127
|
+
partyId?: string;
|
|
128
|
+
};
|
|
129
|
+
locationAssignmentId?: string;
|
|
130
|
+
locationAssignment?: {
|
|
131
|
+
id: string;
|
|
132
|
+
title?: string;
|
|
133
|
+
location?: {
|
|
134
|
+
street1?: string;
|
|
135
|
+
city?: {
|
|
136
|
+
title?: string;
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
integrationRef?: AXPIntegrationReference | null;
|
|
141
|
+
metaDataForm?: Record<string, unknown>;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
interface AXMProjectManagementProjectMemberEntityModel extends AXPEntityModel<string> {
|
|
145
|
+
projectId: string;
|
|
146
|
+
project?: {
|
|
147
|
+
id: string;
|
|
148
|
+
title?: string;
|
|
149
|
+
displayName?: string;
|
|
150
|
+
};
|
|
151
|
+
emlployeeId: string;
|
|
152
|
+
employee?: {
|
|
153
|
+
id: string;
|
|
154
|
+
title?: string;
|
|
155
|
+
displayName?: string;
|
|
156
|
+
};
|
|
157
|
+
projectTypeRoleTypeId: string;
|
|
158
|
+
projectTypeRoleType?: {
|
|
159
|
+
id: string;
|
|
160
|
+
title?: string;
|
|
161
|
+
displayName?: string;
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
interface AXMProjectManagementProjectTypeAllowedTaskTypeRef {
|
|
166
|
+
id: string;
|
|
167
|
+
title?: string;
|
|
168
|
+
name?: string;
|
|
169
|
+
}
|
|
170
|
+
interface AXMProjectManagementProjectTypeEntityModel extends AXPEntityModel<string> {
|
|
171
|
+
title: string;
|
|
172
|
+
description?: string;
|
|
173
|
+
metaDataList?: AXMMetaDataBuilderValue;
|
|
174
|
+
allowedTaskTypeIds?: string[];
|
|
175
|
+
allowedTaskTypes?: AXMProjectManagementProjectTypeAllowedTaskTypeRef[];
|
|
176
|
+
categoryIds?: string[];
|
|
177
|
+
categories?: AXPCategoryListItem[];
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
interface AXMProjectManagementProjectTypeRoleTypeEntityModel extends AXPEntityModel<string> {
|
|
181
|
+
title: string;
|
|
182
|
+
projectTypeId: string;
|
|
183
|
+
projectType?: {
|
|
184
|
+
id: string;
|
|
185
|
+
title?: string;
|
|
186
|
+
};
|
|
187
|
+
description: string;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export { AXMPermissionsKeys, AXPProjectManagementMenuKeys, AXPProjectsWorkPermissionKeys, PM_CATALOG_SCOPE, PM_PROJECT_ENTITY_SOURCE, RootConfig };
|
|
191
|
+
export type { AXMProjectManagementProjectEntityModel, AXMProjectManagementProjectMemberEntityModel, AXMProjectManagementProjectTypeAllowedTaskTypeRef, AXMProjectManagementProjectTypeEntityModel, AXMProjectManagementProjectTypeRoleTypeEntityModel, AXMProjectmanagementProjectStatus };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import * as i1 from '@acorex-platform/framework-client/runtime';
|
|
3
|
+
import * as _acorex_platform_framework_client_common from '@acorex-platform/framework-client/common';
|
|
4
|
+
import { AXPMenuProvider, AXPMenuProviderContext, AXPSearchCommandProvider, AXPSettingDefinitionProvider, AXPSettingDefinitionProviderContext } from '@acorex-platform/framework-client/common';
|
|
5
|
+
|
|
6
|
+
declare class AXMProjectManagementModule {
|
|
7
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AXMProjectManagementModule, never>;
|
|
8
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<AXMProjectManagementModule, never, [typeof i1.AXPRuntimeModule], never>;
|
|
9
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<AXMProjectManagementModule>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
declare class AXMMenuProvider implements AXPMenuProvider {
|
|
13
|
+
private entityService;
|
|
14
|
+
provide(context: AXPMenuProviderContext): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
declare class AXMSearchCommandProvider extends AXPSearchCommandProvider {
|
|
18
|
+
commands: _acorex_platform_framework_client_common.AXPSearchResult[];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
declare class AXMSettingProvider implements AXPSettingDefinitionProvider {
|
|
22
|
+
provide(context: AXPSettingDefinitionProviderContext): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export { AXMMenuProvider, AXMProjectManagementModule, AXMSearchCommandProvider, AXMSettingProvider };
|