@acorex/modules 21.0.0-next.89 → 21.0.0-next.90

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.
Files changed (91) hide show
  1. package/fesm2022/acorex-modules-common.mjs +9 -9
  2. package/fesm2022/acorex-modules-common.mjs.map +1 -1
  3. package/fesm2022/{acorex-modules-conversation-acorex-modules-conversation-B_JcAHvL.mjs → acorex-modules-conversation-acorex-modules-conversation-Dc8te-PO.mjs} +364 -237
  4. package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-Dc8te-PO.mjs.map +1 -0
  5. package/fesm2022/{acorex-modules-conversation-after-message-sent.command-DcrS7_vV.mjs → acorex-modules-conversation-after-message-sent.command-DxDe6o9N.mjs} +2 -2
  6. package/fesm2022/{acorex-modules-conversation-after-message-sent.command-DcrS7_vV.mjs.map → acorex-modules-conversation-after-message-sent.command-DxDe6o9N.mjs.map} +1 -1
  7. package/fesm2022/{acorex-modules-conversation-assist-delegated-agent-detail-popup.component-BCkJEAmX.mjs → acorex-modules-conversation-assist-delegated-agent-detail-popup.component-Dyx_n0bi.mjs} +3 -3
  8. package/fesm2022/{acorex-modules-conversation-assist-delegated-agent-detail-popup.component-BCkJEAmX.mjs.map → acorex-modules-conversation-assist-delegated-agent-detail-popup.component-Dyx_n0bi.mjs.map} +1 -1
  9. package/fesm2022/{acorex-modules-conversation-comments-page.component-B6TJhe4T.mjs → acorex-modules-conversation-comments-page.component--g4ugC_L.mjs} +2 -2
  10. package/fesm2022/{acorex-modules-conversation-comments-page.component-B6TJhe4T.mjs.map → acorex-modules-conversation-comments-page.component--g4ugC_L.mjs.map} +1 -1
  11. package/fesm2022/{acorex-modules-conversation-emit-typing-indicator.command-CWRdPl-S.mjs → acorex-modules-conversation-emit-typing-indicator.command-BOldPLQ0.mjs} +2 -2
  12. package/fesm2022/{acorex-modules-conversation-emit-typing-indicator.command-CWRdPl-S.mjs.map → acorex-modules-conversation-emit-typing-indicator.command-BOldPLQ0.mjs.map} +1 -1
  13. package/fesm2022/{acorex-modules-conversation-mark-conversation-unread.command-CZlsLAsb.mjs → acorex-modules-conversation-mark-conversation-unread.command-O_zPrBQ0.mjs} +2 -2
  14. package/fesm2022/{acorex-modules-conversation-mark-conversation-unread.command-CZlsLAsb.mjs.map → acorex-modules-conversation-mark-conversation-unread.command-O_zPrBQ0.mjs.map} +1 -1
  15. package/fesm2022/{acorex-modules-conversation-retry-assist-response.command-Cly1-RKt.mjs → acorex-modules-conversation-retry-assist-response.command-DsB-CP3R.mjs} +2 -2
  16. package/fesm2022/{acorex-modules-conversation-retry-assist-response.command-Cly1-RKt.mjs.map → acorex-modules-conversation-retry-assist-response.command-DsB-CP3R.mjs.map} +1 -1
  17. package/fesm2022/{acorex-modules-conversation-send-assist-chat-message.command-D5QWTKqh.mjs → acorex-modules-conversation-send-assist-chat-message.command-g_NgPuxP.mjs} +2 -2
  18. package/fesm2022/{acorex-modules-conversation-send-assist-chat-message.command-D5QWTKqh.mjs.map → acorex-modules-conversation-send-assist-chat-message.command-g_NgPuxP.mjs.map} +1 -1
  19. package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-DkSZj8fj.mjs → acorex-modules-conversation-start-assist-chat.command-DeMmJdd6.mjs} +2 -2
  20. package/fesm2022/{acorex-modules-conversation-start-assist-chat.command-DkSZj8fj.mjs.map → acorex-modules-conversation-start-assist-chat.command-DeMmJdd6.mjs.map} +1 -1
  21. package/fesm2022/{acorex-modules-conversation-sync-read-state.command-jiEsdxUB.mjs → acorex-modules-conversation-sync-read-state.command-4YxdwLaE.mjs} +2 -2
  22. package/fesm2022/{acorex-modules-conversation-sync-read-state.command-jiEsdxUB.mjs.map → acorex-modules-conversation-sync-read-state.command-4YxdwLaE.mjs.map} +1 -1
  23. package/fesm2022/acorex-modules-conversation.mjs +1 -1
  24. package/fesm2022/{acorex-modules-dashboard-management-acorex-modules-dashboard-management-DLuhOPFz.mjs → acorex-modules-dashboard-management-acorex-modules-dashboard-management-kph3UxDu.mjs} +94 -41
  25. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-kph3UxDu.mjs.map +1 -0
  26. package/fesm2022/{acorex-modules-dashboard-management-index-gjCiELmH.mjs → acorex-modules-dashboard-management-index-rp9dgARq.mjs} +2 -2
  27. package/fesm2022/{acorex-modules-dashboard-management-index-gjCiELmH.mjs.map → acorex-modules-dashboard-management-index-rp9dgARq.mjs.map} +1 -1
  28. package/fesm2022/acorex-modules-dashboard-management.mjs +1 -1
  29. package/fesm2022/{acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs → acorex-modules-document-management-drive-choose.component-Dx1slMSA.mjs} +3 -3
  30. package/fesm2022/{acorex-modules-document-management-drive-choose.component-DyJoXajP.mjs.map → acorex-modules-document-management-drive-choose.component-Dx1slMSA.mjs.map} +1 -1
  31. package/fesm2022/acorex-modules-document-management.mjs +268 -351
  32. package/fesm2022/acorex-modules-document-management.mjs.map +1 -1
  33. package/fesm2022/{acorex-modules-human-capital-management-acorex-modules-human-capital-management-VJ2NUSm1.mjs → acorex-modules-human-capital-management-acorex-modules-human-capital-management-BZwLfZkb.mjs} +42 -21
  34. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-BZwLfZkb.mjs.map +1 -0
  35. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-FgXkyZR_.mjs → acorex-modules-human-capital-management-approve-leave-request.command-B_EBDijL.mjs} +2 -2
  36. package/fesm2022/{acorex-modules-human-capital-management-approve-leave-request.command-FgXkyZR_.mjs.map → acorex-modules-human-capital-management-approve-leave-request.command-B_EBDijL.mjs.map} +1 -1
  37. package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-D2yCvifI.mjs → acorex-modules-human-capital-management-assign-position-assignment.command-ZzWBeTv1.mjs} +2 -2
  38. package/fesm2022/{acorex-modules-human-capital-management-assign-position-assignment.command-D2yCvifI.mjs.map → acorex-modules-human-capital-management-assign-position-assignment.command-ZzWBeTv1.mjs.map} +1 -1
  39. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-DnmsVNwU.mjs → acorex-modules-human-capital-management-cancel-leave-request.command-Bd3RvlNm.mjs} +2 -2
  40. package/fesm2022/{acorex-modules-human-capital-management-cancel-leave-request.command-DnmsVNwU.mjs.map → acorex-modules-human-capital-management-cancel-leave-request.command-Bd3RvlNm.mjs.map} +1 -1
  41. package/fesm2022/{acorex-modules-human-capital-management-edit-personal-info.command-B0ZUfbqn.mjs → acorex-modules-human-capital-management-edit-personal-info.command-Drbi1WMd.mjs} +2 -2
  42. package/fesm2022/{acorex-modules-human-capital-management-edit-personal-info.command-B0ZUfbqn.mjs.map → acorex-modules-human-capital-management-edit-personal-info.command-Drbi1WMd.mjs.map} +1 -1
  43. package/fesm2022/{acorex-modules-human-capital-management-edit-signature.command-h2kTqSg0.mjs → acorex-modules-human-capital-management-edit-signature.command-CRPqnXIj.mjs} +2 -2
  44. package/fesm2022/{acorex-modules-human-capital-management-edit-signature.command-h2kTqSg0.mjs.map → acorex-modules-human-capital-management-edit-signature.command-CRPqnXIj.mjs.map} +1 -1
  45. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-BdrdgvbN.mjs → acorex-modules-human-capital-management-reject-leave-request.command-BC-1Kixd.mjs} +2 -2
  46. package/fesm2022/{acorex-modules-human-capital-management-reject-leave-request.command-BdrdgvbN.mjs.map → acorex-modules-human-capital-management-reject-leave-request.command-BC-1Kixd.mjs.map} +1 -1
  47. package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-S7Px6Y4B.mjs → acorex-modules-human-capital-management-revoke-position-assignment.command-Caylq9Rv.mjs} +2 -2
  48. package/fesm2022/{acorex-modules-human-capital-management-revoke-position-assignment.command-S7Px6Y4B.mjs.map → acorex-modules-human-capital-management-revoke-position-assignment.command-Caylq9Rv.mjs.map} +1 -1
  49. package/fesm2022/{acorex-modules-human-capital-management-start-leave-request-flow.command-C_tE-D_Y.mjs → acorex-modules-human-capital-management-start-leave-request-flow.command-BsEwA1VM.mjs} +2 -2
  50. package/fesm2022/{acorex-modules-human-capital-management-start-leave-request-flow.command-C_tE-D_Y.mjs.map → acorex-modules-human-capital-management-start-leave-request-flow.command-BsEwA1VM.mjs.map} +1 -1
  51. package/fesm2022/{acorex-modules-human-capital-management-start-lifecycle-event-flow.command-mMP3Yy01.mjs → acorex-modules-human-capital-management-start-lifecycle-event-flow.command-B8xK2iTn.mjs} +2 -2
  52. package/fesm2022/{acorex-modules-human-capital-management-start-lifecycle-event-flow.command-mMP3Yy01.mjs.map → acorex-modules-human-capital-management-start-lifecycle-event-flow.command-B8xK2iTn.mjs.map} +1 -1
  53. package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1
  54. package/fesm2022/acorex-modules-platform-dev-tools.mjs +2 -2
  55. package/fesm2022/acorex-modules-platform-dev-tools.mjs.map +1 -1
  56. package/fesm2022/acorex-modules-project-management.mjs +707 -424
  57. package/fesm2022/acorex-modules-project-management.mjs.map +1 -1
  58. package/fesm2022/acorex-modules-report-management.mjs +1 -1
  59. package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
  60. package/fesm2022/acorex-modules-task-management-start-task-flow.command-HYdQOWDe.mjs +115 -0
  61. package/fesm2022/acorex-modules-task-management-start-task-flow.command-HYdQOWDe.mjs.map +1 -0
  62. package/fesm2022/{acorex-modules-task-management-task-board.page-DTWxd_vG.mjs → acorex-modules-task-management-task-board.page-BMTjJlry.mjs} +3 -3
  63. package/fesm2022/{acorex-modules-task-management-task-board.page-DTWxd_vG.mjs.map → acorex-modules-task-management-task-board.page-BMTjJlry.mjs.map} +1 -1
  64. package/fesm2022/acorex-modules-task-management.mjs +433 -460
  65. package/fesm2022/acorex-modules-task-management.mjs.map +1 -1
  66. package/fesm2022/{acorex-modules-timesheet-management-report-hours-by-project.query-z38wZLKJ.mjs → acorex-modules-timesheet-management-report-hours-by-project.query-CGc1Q6aB.mjs} +2 -2
  67. package/fesm2022/acorex-modules-timesheet-management-report-hours-by-project.query-CGc1Q6aB.mjs.map +1 -0
  68. package/fesm2022/{acorex-modules-timesheet-management-resolve-work-item-from-jira-issue.command-BDfvz6fH.mjs → acorex-modules-timesheet-management-resolve-work-item-from-jira-issue.command-AIcAUd3s.mjs} +2 -2
  69. package/fesm2022/{acorex-modules-timesheet-management-resolve-work-item-from-jira-issue.command-BDfvz6fH.mjs.map → acorex-modules-timesheet-management-resolve-work-item-from-jira-issue.command-AIcAUd3s.mjs.map} +1 -1
  70. package/fesm2022/acorex-modules-timesheet-management.mjs +8 -8
  71. package/fesm2022/acorex-modules-timesheet-management.mjs.map +1 -1
  72. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-edit.component-CFF7X1MO.mjs +70 -0
  73. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-edit.component-CFF7X1MO.mjs.map +1 -0
  74. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-view.component-DwC2aHVt.mjs +70 -0
  75. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram-widget-view.component-DwC2aHVt.mjs.map +1 -0
  76. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram.types-DmzV305e.mjs +195 -0
  77. package/fesm2022/acorex-modules-workplacesafety-management-control-hierarchy-diagram.types-DmzV305e.mjs.map +1 -0
  78. package/fesm2022/acorex-modules-workplacesafety-management.mjs +139 -16
  79. package/fesm2022/acorex-modules-workplacesafety-management.mjs.map +1 -1
  80. package/package.json +2 -2
  81. package/types/acorex-modules-dashboard-management.d.ts +30 -11
  82. package/types/acorex-modules-document-management.d.ts +21 -5
  83. package/types/acorex-modules-human-capital-management.d.ts +4 -0
  84. package/types/acorex-modules-project-management.d.ts +46 -23
  85. package/types/acorex-modules-task-management.d.ts +80 -11
  86. package/types/acorex-modules-timesheet-management.d.ts +2 -2
  87. package/types/acorex-modules-workplacesafety-management.d.ts +7 -2
  88. package/fesm2022/acorex-modules-conversation-acorex-modules-conversation-B_JcAHvL.mjs.map +0 -1
  89. package/fesm2022/acorex-modules-dashboard-management-acorex-modules-dashboard-management-DLuhOPFz.mjs.map +0 -1
  90. package/fesm2022/acorex-modules-human-capital-management-acorex-modules-human-capital-management-VJ2NUSm1.mjs.map +0 -1
  91. package/fesm2022/acorex-modules-timesheet-management-report-hours-by-project.query-z38wZLKJ.mjs.map +0 -1
@@ -1,21 +1,22 @@
1
- import { AXPDeviceService, AXP_MODULE_MANIFEST_PROVIDER } from '@acorex/platform/core';
1
+ import { AXP_IDENTIFIER_RULES } from '@acorex/modules/identifier-management';
2
+ import { AXP_MODULE_MANIFEST_PROVIDER, AXP_CATALOG_SCOPE_DEFINITION_PROVIDER, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER } from '@acorex/platform/core';
2
3
  import { AXPEntityService, AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';
3
4
  import * as i0 from '@angular/core';
4
- import { Injectable, inject, input, signal, computed, effect, ViewEncapsulation, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
5
- import { AXPCommandService, AXPRuntimeModule } from '@acorex/platform/runtime';
6
- import { AXP_PAGE_COMPONENT_PROVIDER } from '@acorex/platform/layout/components';
5
+ import { Injectable, inject, NgModule } from '@angular/core';
6
+ import { AXPRuntimeModule } from '@acorex/platform/runtime';
7
7
  import { AXPSearchCommandProvider, createEntitySearchCommand, AXPEntityCommandScope, AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER, AXP_STATUS_PROVIDERS } from '@acorex/platform/common';
8
8
  import { AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex/platform/auth';
9
9
  import { AXPCommonMenuKeys } from '@acorex/modules/common';
10
- import * as i2 from '@acorex/core/translation';
11
- import { AXTranslationModule } from '@acorex/core/translation';
12
- import { AXPLayoutRendererComponent } from '@acorex/platform/layout/builder';
13
- import { AXPPageLayoutBaseComponent, AXPPageLayoutBase } from '@acorex/platform/layout/views';
14
- import { AXPWidgetsCatalog, AXPStatusProvider, AXPSystemActionType, AXPWidgetsList } from '@acorex/platform/contracts';
15
- import * as i1 from '@angular/common';
16
- import { CommonModule } from '@angular/common';
10
+ import { AXPStatusProvider, AXPWidgetsCatalog, AXPWidgetsList } from '@acorex/platform/contracts';
11
+ import { AXPTaskManagementCommandKeys } from '@acorex/modules/task-management';
12
+ import { isEmpty, defaultTo, merge, isString, uniq } from 'lodash-es';
17
13
  import { createAllQueryView, entityMasterCrudActions, entityMasterRecordActions, AXPEntityCommandScope as AXPEntityCommandScope$1, entityDetailsCrudActions } from '@acorex/platform/layout/entity-contracts';
18
14
 
15
+ /** Catalog scope for project-management workflows and related catalogs. */
16
+ const PM_CATALOG_SCOPE = 'project-management.pm';
17
+ /** Canonical entity source for {@link AXPEntityReference.type} on project subjects. */
18
+ const PM_PROJECT_ENTITY_SOURCE = 'ProjectManagement.Project';
19
+
19
20
  const AXPProjectManagementMenuKeys = {
20
21
  Root: 'project-management:menu',
21
22
  Projects: 'project-management:menu:projects',
@@ -67,8 +68,15 @@ const RootConfig = {
67
68
  titlePlural: `@project-management:projects.project-types.plural`,
68
69
  icon: 'fa-light fa-rectangle-vertical-history',
69
70
  },
71
+ projectTypeCategory: {
72
+ name: 'ProjectTypeCategory',
73
+ title: '@project-management:projects.project-type-categories.title',
74
+ titlePlural: '@project-management:projects.project-type-categories.plural',
75
+ icon: 'fa-light fa-layer-group',
76
+ },
70
77
  project: {
71
78
  name: 'Project',
79
+ source: `${config.module}.Project`,
72
80
  title: '@project-management:projects.terms.title',
73
81
  titlePlural: '@project-management:projects.terms.plural',
74
82
  icon: 'fa-light fa-square-kanban',
@@ -76,8 +84,6 @@ const RootConfig = {
76
84
  },
77
85
  };
78
86
 
79
- const PROJECT_TASK_BOARD_PAGE_COMPONENT_KEY = 'project-task-board-page';
80
-
81
87
  //#region ---- Contracts barrel ----
82
88
  //#endregion
83
89
 
@@ -151,7 +157,6 @@ class AXMMenuProvider {
151
157
  permissions: [AXMPermissionsKeys.ProjectManagement.ProjectType.Management],
152
158
  },
153
159
  },
154
- // previously TaskTypes menu was here, now removed with TaskType entity
155
160
  ]);
156
161
  }
157
162
  }
@@ -246,208 +251,6 @@ class AXMSearchCommandProvider extends AXPSearchCommandProvider {
246
251
  }
247
252
  }
248
253
 
249
- class AXMProjectTaskBoardPageComponentProvider {
250
- async components() {
251
- return [
252
- {
253
- key: PROJECT_TASK_BOARD_PAGE_COMPONENT_KEY,
254
- loader: () => Promise.resolve().then(function () { return projectTaskBoardPage_component; }).then((m) => m.AXMProjectTaskBoardPageComponent),
255
- },
256
- ];
257
- }
258
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMProjectTaskBoardPageComponentProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
259
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMProjectTaskBoardPageComponentProvider }); }
260
- }
261
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMProjectTaskBoardPageComponentProvider, decorators: [{
262
- type: Injectable
263
- }] });
264
-
265
- //#region ---- Component ----
266
- class AXMProjectTaskBoardPageComponent extends AXPPageLayoutBaseComponent {
267
- constructor() {
268
- super();
269
- this.rootContext = input(...(ngDevMode ? [undefined, { debugName: "rootContext" }] : /* istanbul ignore next */ []));
270
- this.pageConfig = input(...(ngDevMode ? [undefined, { debugName: "pageConfig" }] : /* istanbul ignore next */ []));
271
- this.options = input({}, ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
272
- /** Set once after create menu is built from rootContext; prevents re-running. */
273
- this.isInitialized = false;
274
- /** Menu items built once when rootContext is available. */
275
- this.createMenuItems = signal([], ...(ngDevMode ? [{ debugName: "createMenuItems" }] : /* istanbul ignore next */ []));
276
- this.deviceService = inject(AXPDeviceService);
277
- this.commandService = inject(AXPCommandService);
278
- //#endregion
279
- //#region ---- Workflow list layout (entity-list with projectId filter) ----
280
- /**
281
- * Entity-list widget node for WorkflowInstance, filtered by current project.
282
- * Only rendered when project id is available.
283
- */
284
- this.workflowListLayout = computed(() => {
285
- const ctx = this.rootContext();
286
- const projectId = ctx && typeof ctx === 'object' && 'id' in ctx ? ctx.id : undefined;
287
- if (!projectId) {
288
- return null;
289
- }
290
- return {
291
- type: AXPWidgetsCatalog.entityList,
292
- name: 'project-workflow-instances',
293
- path: 'workflowInstances',
294
- mode: 'view',
295
- options: {
296
- entity: 'WorkflowManagement.WorkflowInstance',
297
- showEntityActions: false,
298
- showToolbar: true,
299
- actions: [
300
- {
301
- command: 'open-entity',
302
- scope: AXPEntityCommandScope.Individual,
303
- priority: 'secondary',
304
- hidden: true,
305
- },
306
- {
307
- command: 'delete-entity',
308
- scope: AXPEntityCommandScope.Individual,
309
- priority: 'secondary',
310
- hidden: true,
311
- },
312
- ],
313
- },
314
- defaultValue: {
315
- toolbar: {
316
- filters: [
317
- {
318
- field: 'workflowInstance.workflowState.input.projectId',
319
- operator: { type: 'equal' },
320
- value: projectId,
321
- hidden: true,
322
- },
323
- ],
324
- },
325
- },
326
- };
327
- }, ...(ngDevMode ? [{ debugName: "workflowListLayout" }] : /* istanbul ignore next */ []));
328
- this.layoutContext = computed(() => ({}), ...(ngDevMode ? [{ debugName: "layoutContext" }] : /* istanbul ignore next */ []));
329
- effect(() => {
330
- const ctx = this.rootContext();
331
- if (ctx == null || this.isInitialized) {
332
- return;
333
- }
334
- const projectType = ctx?.projectType ?? {};
335
- const workflows = projectType.workflows ?? [];
336
- const items = workflows.filter((w) => !!w?.name);
337
- if (!items.length) {
338
- this.isInitialized = true;
339
- return;
340
- }
341
- const typedCtx = ctx;
342
- console.log('typedCtx', typedCtx);
343
- console.log('typedCtx.metaDataForm', typedCtx?.metaDataForm);
344
- this.createMenuItems.set([
345
- {
346
- title: '@general:actions.create.title',
347
- icon: 'fa-light fa-plus',
348
- color: 'primary',
349
- items: items.map((w) => ({
350
- name: `start-workflow:${w.name}`,
351
- title: w.title ?? w.name,
352
- icon: 'fa-light fa-diagram-project',
353
- command: {
354
- name: 'WorkflowManagement.WorkflowDefinition:Execute',
355
- options: {
356
- workflowId: w.name,
357
- input: {
358
- metadata: {
359
- ...(typedCtx?.metaDataForm ?? {}),
360
- isNeedReview: true,
361
- },
362
- projectId: typedCtx?.id,
363
- projectTypeId: typedCtx?.projectType?.id,
364
- },
365
- },
366
- },
367
- })),
368
- },
369
- ]);
370
- this.isInitialized = true;
371
- });
372
- }
373
- //#endregion
374
- //#region ---- Lifecycle ----
375
- async ngOnInit() {
376
- await super.ngOnInit();
377
- }
378
- //#endregion
379
- //#region ---- Page metadata (AXPPageLayoutBase) ----
380
- async getPrimaryMenuItems() {
381
- return this.createMenuItems();
382
- }
383
- async getSecondaryMenuItems() {
384
- return [];
385
- }
386
- async getPageTitle() {
387
- return this.translateService.translateAsync('@project-management:projects.tasks.plural');
388
- }
389
- async getPageBreadcrumbs() {
390
- return [];
391
- }
392
- async execute(command) {
393
- if (command.name === 'WorkflowManagement.WorkflowDefinition:Execute') {
394
- await this.commandService.execute(command.name, command.options);
395
- }
396
- }
397
- //#endregion
398
- static { this.COMPONENT_KEY = PROJECT_TASK_BOARD_PAGE_COMPONENT_KEY; }
399
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMProjectTaskBoardPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
400
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMProjectTaskBoardPageComponent, isStandalone: true, selector: "axm-project-task-board-page", inputs: { rootContext: { classPropertyName: "rootContext", publicName: "rootContext", isSignal: true, isRequired: false, transformFunction: null }, pageConfig: { classPropertyName: "pageConfig", publicName: "pageConfig", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "ax-flex ax-flex-col ax-flex-1 ax-min-h-0 ax-h-full" }, providers: [
401
- {
402
- provide: AXPPageLayoutBase,
403
- useExisting: AXMProjectTaskBoardPageComponent,
404
- },
405
- ], usesInheritance: true, ngImport: i0, template: `
406
- <div class="ax-flex-1 ax-min-h-0 ax-h-full ax-flex ax-flex-col">
407
- @if (workflowListLayout(); as layout) {
408
- <axp-layout-renderer [layout]="layout" [context]="layoutContext()" class="ax-flex-1 ax-min-h-0 ax-w-full" />
409
- } @else {
410
- <div class="ax-p-4 ax-text-sm ax-text-muted">
411
- {{ '@general:state-message.empty.title' | translate | async }}
412
- </div>
413
- }
414
- </div>
415
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXPLayoutRendererComponent, selector: "axp-layout-renderer", inputs: ["layout", "context", "look", "mode"], outputs: ["contextChange", "contextInitiated", "validityChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
416
- }
417
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMProjectTaskBoardPageComponent, decorators: [{
418
- type: Component,
419
- args: [{
420
- selector: 'axm-project-task-board-page',
421
- standalone: true,
422
- imports: [CommonModule, AXPLayoutRendererComponent, AXTranslationModule],
423
- template: `
424
- <div class="ax-flex-1 ax-min-h-0 ax-h-full ax-flex ax-flex-col">
425
- @if (workflowListLayout(); as layout) {
426
- <axp-layout-renderer [layout]="layout" [context]="layoutContext()" class="ax-flex-1 ax-min-h-0 ax-w-full" />
427
- } @else {
428
- <div class="ax-p-4 ax-text-sm ax-text-muted">
429
- {{ '@general:state-message.empty.title' | translate | async }}
430
- </div>
431
- }
432
- </div>
433
- `,
434
- changeDetection: ChangeDetectionStrategy.OnPush,
435
- encapsulation: ViewEncapsulation.None,
436
- host: { class: 'ax-flex ax-flex-col ax-flex-1 ax-min-h-0 ax-h-full' },
437
- providers: [
438
- {
439
- provide: AXPPageLayoutBase,
440
- useExisting: AXMProjectTaskBoardPageComponent,
441
- },
442
- ],
443
- }]
444
- }], ctorParameters: () => [], propDecorators: { rootContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootContext", required: false }] }], pageConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageConfig", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }] } });
445
-
446
- var projectTaskBoardPage_component = /*#__PURE__*/Object.freeze({
447
- __proto__: null,
448
- AXMProjectTaskBoardPageComponent: AXMProjectTaskBoardPageComponent
449
- });
450
-
451
254
  //#region ---- Imports ----
452
255
  //#endregion
453
256
  //#region ---- Project Status Provider ----
@@ -516,17 +319,280 @@ class AXMProjectStatusProvider extends AXPStatusProvider {
516
319
  }
517
320
  //#endregion
518
321
 
322
+ //#endregion
323
+ //#region ---- Constants ----
324
+ const WORKFLOW_DEFINITION = 'WorkflowManagement.WorkflowDefinition';
325
+ //#endregion
326
+ //#region ---- Provider ----
327
+ class AXMProjectManagementCatalogScopeDefinitionProvider {
328
+ async items() {
329
+ return [
330
+ {
331
+ name: PM_CATALOG_SCOPE,
332
+ title: '@project-management:catalog-scopes.pm.title',
333
+ description: '@project-management:catalog-scopes.pm.description',
334
+ targets: [WORKFLOW_DEFINITION],
335
+ icon: 'fa-light fa-diagram-project',
336
+ cssClass: 'ax-secondary-lighter',
337
+ order: 15,
338
+ },
339
+ ];
340
+ }
341
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMProjectManagementCatalogScopeDefinitionProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
342
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMProjectManagementCatalogScopeDefinitionProvider }); }
343
+ }
344
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMProjectManagementCatalogScopeDefinitionProvider, decorators: [{
345
+ type: Injectable
346
+ }] });
347
+
348
+ //#region ---- Imports ----
349
+ //#endregion
350
+ /**
351
+ * Expression-evaluator scope for project "Start task" dropdown items (allowed task types).
352
+ */
353
+ class AXMProjectManagementAllowedTaskTypesExpressionEvaluatorScopeProvider {
354
+ constructor() {
355
+ //#region ---- Services & Dependencies ----
356
+ this.entityService = inject(AXPEntityService);
357
+ //#endregion
358
+ }
359
+ //#endregion
360
+ //#region ---- AXPExpressionEvaluatorScopeProvider ----
361
+ async provide(context) {
362
+ context.addScope(RootConfig.module.name, {
363
+ AllowedTaskTypes: async (projectTypeIdRaw) => {
364
+ try {
365
+ const projectTypeId = typeof projectTypeIdRaw === 'string' ? projectTypeIdRaw.trim() : '';
366
+ if (!projectTypeId) {
367
+ return [];
368
+ }
369
+ const allowedRows = await this.loadAllowedTaskTypes(projectTypeId);
370
+ if (isEmpty(allowedRows)) {
371
+ return [];
372
+ }
373
+ return allowedRows.map((row) => this.buildAction(row));
374
+ }
375
+ catch (error) {
376
+ console.error(`${RootConfig.module.name}.AllowedTaskTypes failed:`, error instanceof Error ? error.message : error);
377
+ return [];
378
+ }
379
+ },
380
+ });
381
+ }
382
+ //#endregion
383
+ //#region ---- Helpers ----
384
+ async loadAllowedTaskTypes(projectTypeId) {
385
+ const projectType = (await this.entityService
386
+ .withEntity(RootConfig.module.name, RootConfig.entities.projectType.name)
387
+ .data()
388
+ .byKey(projectTypeId));
389
+ if (!projectType) {
390
+ return [];
391
+ }
392
+ const taskTypeIds = this.resolveAllowedTaskTypeIds(projectType);
393
+ const enriched = [];
394
+ for (const taskTypeId of taskTypeIds) {
395
+ const trimmedId = taskTypeId?.trim();
396
+ if (!trimmedId) {
397
+ continue;
398
+ }
399
+ const taskTypeDetail = (await this.entityService
400
+ .withEntity('TaskManagement', 'TaskType')
401
+ .data()
402
+ .byKey(trimmedId));
403
+ if (!taskTypeDetail?.isActive) {
404
+ continue;
405
+ }
406
+ enriched.push({
407
+ taskTypeId: trimmedId,
408
+ projectTypeId,
409
+ taskTypeDetail: {
410
+ id: taskTypeDetail.id,
411
+ title: taskTypeDetail.title,
412
+ workflowConfig: taskTypeDetail.workflowConfig,
413
+ isActive: taskTypeDetail.isActive,
414
+ },
415
+ });
416
+ }
417
+ return enriched;
418
+ }
419
+ resolveAllowedTaskTypeIds(projectType) {
420
+ const fromRefs = projectType.allowedTaskTypes?.map((row) => row.id).filter(Boolean) ?? [];
421
+ if (!isEmpty(fromRefs)) {
422
+ return fromRefs;
423
+ }
424
+ return defaultTo(projectType.allowedTaskTypeIds, []).filter((id) => typeof id === 'string' && id.trim().length > 0);
425
+ }
426
+ buildAction(row) {
427
+ const taskTypeId = row.taskTypeId;
428
+ const taskTypeTitle = row.taskTypeDetail?.title ?? taskTypeId;
429
+ const workflowConfig = row.taskTypeDetail?.workflowConfig;
430
+ const workflowId = workflowConfig?.workflowName?.trim();
431
+ const guidedFlowCommand = workflowId
432
+ ? {
433
+ name: AXPTaskManagementCommandKeys.Task.StartFlow,
434
+ options: {
435
+ workflowId,
436
+ input: merge(defaultTo(workflowConfig?.defaultInput, {}), {
437
+ taskTypeId,
438
+ taskTypeTitle,
439
+ projectTypeId: row.projectTypeId,
440
+ subjectRef: {
441
+ type: PM_PROJECT_ENTITY_SOURCE,
442
+ id: '{{ context.eval("id") }}',
443
+ title: '{{ context.eval("title") }}',
444
+ },
445
+ }),
446
+ },
447
+ }
448
+ : undefined;
449
+ const notConfiguredCommand = {
450
+ name: 'workflow-activity:show-toast',
451
+ options: {
452
+ message: '@project-management:projects.messages.task-type-not-configured',
453
+ type: 'warning',
454
+ },
455
+ };
456
+ return {
457
+ name: `start-project-task-${taskTypeId}`,
458
+ title: taskTypeTitle,
459
+ icon: 'fa-light fa-play',
460
+ color: 'default',
461
+ command: guidedFlowCommand ?? notConfiguredCommand,
462
+ priority: 'primary',
463
+ type: 'create',
464
+ scope: AXPEntityCommandScope.TypeLevel,
465
+ };
466
+ }
467
+ }
468
+
469
+ //#region ---- Imports ----
470
+ //#endregion
471
+ /**
472
+ * Expression-evaluator scope for resolving allowed document type names from a project record.
473
+ * Unions document type names configured on each allowed TaskType for the project's ProjectType.
474
+ */
475
+ class AXMProjectManagementDocumentTypeNamesExpressionEvaluatorScopeProvider {
476
+ constructor() {
477
+ //#region ---- Services & Dependencies ----
478
+ this.entityService = inject(AXPEntityService);
479
+ //#endregion
480
+ }
481
+ //#endregion
482
+ //#region ---- AXPExpressionEvaluatorScopeProvider ----
483
+ async provide(context) {
484
+ context.addScope(RootConfig.module.name, {
485
+ resolveDocumentTypeNames: async (projectIdRaw) => {
486
+ try {
487
+ const projectId = isString(projectIdRaw) ? projectIdRaw.trim() : '';
488
+ if (!projectId) {
489
+ return [];
490
+ }
491
+ return await this.loadAllowedDocumentTypeNamesForProject(projectId);
492
+ }
493
+ catch (error) {
494
+ console.error(`${RootConfig.module.name}.resolveDocumentTypeNames failed:`, error instanceof Error ? error.message : error);
495
+ return [];
496
+ }
497
+ },
498
+ });
499
+ }
500
+ //#endregion
501
+ //#region ---- Helpers ----
502
+ async loadAllowedDocumentTypeNamesForProject(projectId) {
503
+ const project = (await this.entityService
504
+ .withEntity(RootConfig.module.name, RootConfig.entities.project.name)
505
+ .data()
506
+ .byKey(projectId));
507
+ if (!project) {
508
+ return [];
509
+ }
510
+ const projectTypeId = this.resolveProjectTypeId(project);
511
+ if (!projectTypeId) {
512
+ return [];
513
+ }
514
+ const projectType = (await this.entityService
515
+ .withEntity(RootConfig.module.name, RootConfig.entities.projectType.name)
516
+ .data()
517
+ .byKey(projectTypeId));
518
+ if (!projectType) {
519
+ return [];
520
+ }
521
+ const taskTypeIds = this.resolveAllowedTaskTypeIds(projectType);
522
+ if (isEmpty(taskTypeIds)) {
523
+ return [];
524
+ }
525
+ const names = [];
526
+ for (const taskTypeId of taskTypeIds) {
527
+ const trimmedId = taskTypeId?.trim();
528
+ if (!trimmedId) {
529
+ continue;
530
+ }
531
+ const taskType = (await this.entityService
532
+ .withEntity('TaskManagement', 'TaskType')
533
+ .data()
534
+ .byKey(trimmedId));
535
+ if (!taskType?.isActive) {
536
+ continue;
537
+ }
538
+ names.push(...this.extractDocumentTypeNames(taskType));
539
+ }
540
+ return uniq(names.filter((name) => name.trim().length > 0));
541
+ }
542
+ resolveProjectTypeId(project) {
543
+ const fromNested = project.projectType?.id;
544
+ if (isString(fromNested) && fromNested.trim()) {
545
+ return fromNested.trim();
546
+ }
547
+ const raw = project.projectTypeId;
548
+ if (isString(raw) && raw.trim()) {
549
+ return raw.trim();
550
+ }
551
+ if (raw && typeof raw === 'object' && isString(raw.id)) {
552
+ return (raw.id ?? '').trim();
553
+ }
554
+ return '';
555
+ }
556
+ resolveAllowedTaskTypeIds(projectType) {
557
+ const fromRefs = projectType.allowedTaskTypes?.map((row) => row.id).filter(Boolean) ?? [];
558
+ if (!isEmpty(fromRefs)) {
559
+ return fromRefs;
560
+ }
561
+ return defaultTo(projectType.allowedTaskTypeIds, []).filter((id) => isString(id) && id.trim().length > 0);
562
+ }
563
+ extractDocumentTypeNames(taskType) {
564
+ return (taskType.documentTypes ?? [])
565
+ .map((row) => row?.name)
566
+ .filter((name) => isString(name) && name.trim().length > 0)
567
+ .map((name) => name.trim());
568
+ }
569
+ }
570
+
571
+ const AXM_PROJECT_CODE_IDENTIFIER_RULE = {
572
+ id: 'project-code',
573
+ title: 'Project Code',
574
+ entity: RootConfig.entities.project.source,
575
+ /** `PRJ-` + calendar year + padded sequence. */
576
+ pattern: 'PRJ-{date:YYYY}-{seq:4}',
577
+ enabled: true,
578
+ priority: 1,
579
+ scopeConfig: { byTenant: true, period: 'yearly', minValue: 1, blockSize: 0 },
580
+ };
581
+
519
582
  class AXMProjectManagementModule {
520
583
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMProjectManagementModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
521
584
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXMProjectManagementModule, imports: [AXPRuntimeModule] }); }
522
585
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMProjectManagementModule, providers: [
523
- // Module Manifest Provider
586
+ {
587
+ provide: AXP_IDENTIFIER_RULES,
588
+ multi: true,
589
+ useValue: AXM_PROJECT_CODE_IDENTIFIER_RULE,
590
+ },
524
591
  {
525
592
  provide: AXP_MODULE_MANIFEST_PROVIDER,
526
593
  useValue: ProjectManagementManifest,
527
594
  multi: true,
528
595
  },
529
- // Provider references (now using tokens)
530
596
  {
531
597
  provide: AXP_PERMISSION_DEFINITION_PROVIDER,
532
598
  useClass: AXMPermissionDefinitionProvider,
@@ -553,13 +619,23 @@ class AXMProjectManagementModule {
553
619
  multi: true,
554
620
  },
555
621
  {
556
- provide: AXP_PAGE_COMPONENT_PROVIDER,
622
+ provide: AXP_STATUS_PROVIDERS,
623
+ useClass: AXMProjectStatusProvider,
557
624
  multi: true,
558
- useClass: AXMProjectTaskBoardPageComponentProvider,
559
625
  },
560
626
  {
561
- provide: AXP_STATUS_PROVIDERS,
562
- useClass: AXMProjectStatusProvider,
627
+ provide: AXP_CATALOG_SCOPE_DEFINITION_PROVIDER,
628
+ useClass: AXMProjectManagementCatalogScopeDefinitionProvider,
629
+ multi: true,
630
+ },
631
+ {
632
+ provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
633
+ useClass: AXMProjectManagementAllowedTaskTypesExpressionEvaluatorScopeProvider,
634
+ multi: true,
635
+ },
636
+ {
637
+ provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
638
+ useClass: AXMProjectManagementDocumentTypeNamesExpressionEvaluatorScopeProvider,
563
639
  multi: true,
564
640
  },
565
641
  ], imports: [AXPRuntimeModule] }); }
@@ -569,19 +645,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
569
645
  args: [{
570
646
  imports: [
571
647
  AXPRuntimeModule,
572
- // Entity Modules
573
- // Feature Modules
574
648
  ],
575
649
  exports: [],
576
650
  declarations: [],
577
651
  providers: [
578
- // Module Manifest Provider
652
+ {
653
+ provide: AXP_IDENTIFIER_RULES,
654
+ multi: true,
655
+ useValue: AXM_PROJECT_CODE_IDENTIFIER_RULE,
656
+ },
579
657
  {
580
658
  provide: AXP_MODULE_MANIFEST_PROVIDER,
581
659
  useValue: ProjectManagementManifest,
582
660
  multi: true,
583
661
  },
584
- // Provider references (now using tokens)
585
662
  {
586
663
  provide: AXP_PERMISSION_DEFINITION_PROVIDER,
587
664
  useClass: AXMPermissionDefinitionProvider,
@@ -608,13 +685,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
608
685
  multi: true,
609
686
  },
610
687
  {
611
- provide: AXP_PAGE_COMPONENT_PROVIDER,
688
+ provide: AXP_STATUS_PROVIDERS,
689
+ useClass: AXMProjectStatusProvider,
690
+ multi: true,
691
+ },
692
+ {
693
+ provide: AXP_CATALOG_SCOPE_DEFINITION_PROVIDER,
694
+ useClass: AXMProjectManagementCatalogScopeDefinitionProvider,
612
695
  multi: true,
613
- useClass: AXMProjectTaskBoardPageComponentProvider,
614
696
  },
615
697
  {
616
- provide: AXP_STATUS_PROVIDERS,
617
- useClass: AXMProjectStatusProvider,
698
+ provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
699
+ useClass: AXMProjectManagementAllowedTaskTypesExpressionEvaluatorScopeProvider,
700
+ multi: true,
701
+ },
702
+ {
703
+ provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
704
+ useClass: AXMProjectManagementDocumentTypeNamesExpressionEvaluatorScopeProvider,
618
705
  multi: true,
619
706
  },
620
707
  ],
@@ -636,7 +723,17 @@ async function projectFactory() {
636
723
  },
637
724
  },
638
725
  plugins: [
726
+ { name: 'comments', options: { display: 'page' } },
639
727
  { name: 'history' },
728
+ { name: 'archive' },
729
+ { name: 'identifier', options: { field: 'code', rule: 'project-code' } },
730
+ {
731
+ name: 'documents',
732
+ options: {
733
+ documentTypeNames: `{{ await ${RootConfig.module.name}.resolveDocumentTypeNames(context.eval("id")) }}`,
734
+ },
735
+ },
736
+ { name: 'unique-fields', options: { fields: 'code', scope: 'global' } },
640
737
  {
641
738
  name: 'status',
642
739
  options: {
@@ -680,7 +777,7 @@ async function projectFactory() {
680
777
  },
681
778
  },
682
779
  priority: 'primary',
683
- type: AXPSystemActionType.Create,
780
+ type: 'create',
684
781
  scope: AXPEntityCommandScope$1.TypeLevel,
685
782
  },
686
783
  ...entityDetailsCrudActions('projectId', { create: false }),
@@ -690,23 +787,48 @@ async function projectFactory() {
690
787
  type: 'page-list',
691
788
  },
692
789
  },
693
- ],
694
- pages: [
695
790
  {
696
- componentKey: PROJECT_TASK_BOARD_PAGE_COMPONENT_KEY,
697
- title: '@project-management:projects.tasks.plural',
698
- icon: 'fa-light fa-list-check',
699
- layout: { order: 20 },
791
+ entity: 'TaskManagement.Task',
792
+ title: '@task-management:task.plural-title',
793
+ columns: ['title', 'taskTypeId', 'statusId', 'dueDate', 'progress'],
794
+ conditions: [
795
+ { name: 'subjectRef.type', operator: { type: 'equal' }, value: PM_PROJECT_ENTITY_SOURCE },
796
+ { name: 'subjectRef.id', operator: { type: 'equal' }, value: '{{ context.eval("id") }}' },
797
+ ],
798
+ excludeProperties: ['subjectRef'],
799
+ actions: [
800
+ {
801
+ title: '@project-management:projects.entities.project.related-entities.task-start.title',
802
+ icon: 'fa-light fa-play',
803
+ command: {
804
+ name: 'Entity:Create',
805
+ options: {
806
+ process: {
807
+ redirect: false,
808
+ canCreateNewOne: true,
809
+ data: {},
810
+ },
811
+ },
812
+ },
813
+ priority: 'primary',
814
+ type: 'create',
815
+ scope: AXPEntityCommandScope$1.TypeLevel,
816
+ items: `{{ await ${RootConfig.module.name}.AllowedTaskTypes(context.eval("projectType.id")) }}`,
817
+ },
818
+ ...entityDetailsCrudActions('subjectRef.id', { create: false, edit: true, delete: true, view: true }),
819
+ ],
820
+ layout: { type: 'page-list', position: 'after', order: 10 },
700
821
  },
701
822
  ],
702
823
  groups: [
703
824
  { id: 'basic-info', title: `@general:terms.interface.basic-info` },
704
- { id: 'additional-info', title: '@general:terms.interface.additional-info' },
825
+ { id: 'organization-parties', title: `@project-management:projects.groups.organization-parties` },
826
+ { id: 'schedule', title: `@project-management:projects.groups.schedule` },
705
827
  ],
706
828
  properties: [
707
829
  {
708
- name: 'name',
709
- title: '@general:terms.common.name',
830
+ name: 'code',
831
+ title: '@general:terms.common.code',
710
832
  groupId: 'basic-info',
711
833
  options: {
712
834
  sort: {
@@ -723,19 +845,44 @@ async function projectFactory() {
723
845
  },
724
846
  schema: {
725
847
  dataType: 'string',
848
+ unique: { enabled: true },
726
849
  interface: {
727
850
  type: AXPWidgetsCatalog.text,
851
+ options: {
852
+ disabled: true,
853
+ },
728
854
  },
729
855
  },
730
- validations: [
731
- {
732
- rule: 'required',
856
+ validations: [{ rule: 'required' }],
857
+ },
858
+ {
859
+ name: 'title',
860
+ title: '@general:terms.common.title',
861
+ groupId: 'basic-info',
862
+ options: {
863
+ sort: {
864
+ enabled: true,
733
865
  },
734
- ],
866
+ filter: {
867
+ advance: {
868
+ enabled: true,
869
+ },
870
+ inline: {
871
+ enabled: true,
872
+ },
873
+ },
874
+ },
875
+ schema: {
876
+ dataType: 'string',
877
+ interface: {
878
+ type: AXPWidgetsCatalog.text,
879
+ },
880
+ },
881
+ validations: [{ rule: 'required' }],
735
882
  },
736
883
  {
737
884
  name: 'projectTypeId',
738
- title: '@project-management:projects.terms.projectTypeId',
885
+ title: '@general:terms.common.type',
739
886
  groupId: 'basic-info',
740
887
  options: {
741
888
  sort: {
@@ -761,16 +908,77 @@ async function projectFactory() {
761
908
  expose: [
762
909
  { source: 'id', target: 'projectType.id' },
763
910
  { source: 'title', target: 'projectType.title' },
764
- { source: 'workflows', target: 'projectType.workflows' },
765
911
  ],
766
912
  },
767
913
  },
768
914
  },
769
- validations: [
770
- {
771
- rule: 'required',
915
+ validations: [{ rule: 'required' }],
916
+ },
917
+ {
918
+ name: 'customerId',
919
+ title: '@project-management:projects.terms.customerId',
920
+ groupId: 'organization-parties',
921
+ options: {
922
+ sort: { enabled: true },
923
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
924
+ },
925
+ schema: {
926
+ dataType: 'string',
927
+ interface: {
928
+ type: AXPWidgetsList.Editors.LookupBox,
929
+ options: {
930
+ entity: 'CustomerManagement.Customer',
931
+ textField: 'party.title',
932
+ valueField: 'id',
933
+ look: 'select',
934
+ columns: ['party.code', 'party.title'],
935
+ expose: [
936
+ { source: 'id', target: 'customer.id' },
937
+ { source: 'party.title', target: 'customer.title' },
938
+ { source: 'partyId', target: 'customer.partyId' },
939
+ ],
940
+ },
772
941
  },
773
- ],
942
+ },
943
+ },
944
+ {
945
+ name: 'partyLocationId',
946
+ title: '@project-management:projects.terms.location',
947
+ groupId: 'organization-parties',
948
+ options: {
949
+ sort: { enabled: true },
950
+ filter: { advance: { enabled: true }, inline: { enabled: false } },
951
+ },
952
+ schema: {
953
+ dataType: 'string',
954
+ interface: {
955
+ type: AXPWidgetsList.Editors.LookupBox,
956
+ options: {
957
+ entity: 'BusinessCore.PartyLocation',
958
+ textField: 'location.title',
959
+ valueField: 'id',
960
+ look: 'select',
961
+ columns: ['location.title', 'locationRole.title', 'location.street1', 'location.city.title'],
962
+ expose: [
963
+ { source: 'id', target: 'partyLocation.id' },
964
+ { source: 'location.title', target: 'partyLocation.title' },
965
+ { source: 'location.street1', target: 'partyLocation.location.street1' },
966
+ { source: 'location.city.title', target: 'partyLocation.location.city.title' },
967
+ ],
968
+ filter: {
969
+ logic: 'and',
970
+ filters: [
971
+ {
972
+ field: 'partyId',
973
+ operator: { type: 'equal' },
974
+ value: '{{ context.eval("customer.partyId") }}',
975
+ },
976
+ ],
977
+ },
978
+ triggers: [{ event: "{{ events.context('customerId') }}", action: `{{ widget.refresh() }}` }],
979
+ },
980
+ },
981
+ },
774
982
  },
775
983
  {
776
984
  name: 'description',
@@ -797,11 +1005,43 @@ async function projectFactory() {
797
1005
  },
798
1006
  },
799
1007
  {
800
- name: 'dueDate',
801
- title: '@project-management:projects.terms.duedate',
802
- groupId: 'basic-info',
1008
+ name: 'startDate',
1009
+ title: '@project-management:projects.terms.startDate',
1010
+ groupId: 'schedule',
803
1011
  options: {
804
- sort: {
1012
+ sort: { enabled: true },
1013
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1014
+ },
1015
+ schema: {
1016
+ dataType: 'date',
1017
+ interface: {
1018
+ type: AXPWidgetsCatalog.dateTime,
1019
+ options: { showTime: false },
1020
+ },
1021
+ },
1022
+ },
1023
+ {
1024
+ name: 'endDate',
1025
+ title: '@project-management:projects.terms.endDate',
1026
+ groupId: 'schedule',
1027
+ options: {
1028
+ sort: { enabled: true },
1029
+ filter: { advance: { enabled: true }, inline: { enabled: true } },
1030
+ },
1031
+ schema: {
1032
+ dataType: 'date',
1033
+ interface: {
1034
+ type: AXPWidgetsCatalog.dateTime,
1035
+ options: { showTime: false },
1036
+ },
1037
+ },
1038
+ },
1039
+ {
1040
+ name: 'dueDate',
1041
+ title: '@project-management:projects.terms.duedate',
1042
+ groupId: 'schedule',
1043
+ options: {
1044
+ sort: {
805
1045
  enabled: true,
806
1046
  },
807
1047
  filter: {
@@ -817,12 +1057,46 @@ async function projectFactory() {
817
1057
  dataType: 'date',
818
1058
  interface: {
819
1059
  type: AXPWidgetsCatalog.dateTime,
1060
+ options: { showTime: false },
1061
+ },
1062
+ },
1063
+ },
1064
+ {
1065
+ name: 'actualStartDate',
1066
+ title: '@project-management:projects.terms.actualStartDate',
1067
+ groupId: 'schedule',
1068
+ options: {
1069
+ sort: { enabled: true },
1070
+ filter: { advance: { enabled: true }, inline: { enabled: false } },
1071
+ },
1072
+ schema: {
1073
+ dataType: 'date',
1074
+ interface: {
1075
+ type: AXPWidgetsCatalog.dateTime,
1076
+ options: { showTime: false },
1077
+ },
1078
+ },
1079
+ },
1080
+ {
1081
+ name: 'actualEndDate',
1082
+ title: '@project-management:projects.terms.actualEndDate',
1083
+ groupId: 'schedule',
1084
+ options: {
1085
+ sort: { enabled: true },
1086
+ filter: { advance: { enabled: true }, inline: { enabled: false } },
1087
+ },
1088
+ schema: {
1089
+ dataType: 'date',
1090
+ interface: {
1091
+ type: AXPWidgetsCatalog.dateTime,
1092
+ options: { showTime: false },
820
1093
  },
821
1094
  },
822
1095
  },
823
1096
  ],
824
1097
  columns: [
825
- { name: 'name' },
1098
+ { name: 'code' },
1099
+ { name: 'title' },
826
1100
  { name: 'dueDate' },
827
1101
  { name: 'description' },
828
1102
  { name: 'projectTypeId', options: { dataPath: 'projectType' } },
@@ -831,150 +1105,157 @@ async function projectFactory() {
831
1105
  master: {
832
1106
  create: {
833
1107
  sections: [
834
- {
835
- id: 'basic-info',
836
- },
1108
+ { id: 'basic-info' },
1109
+ { id: 'organization-parties' },
1110
+ { id: 'schedule' },
837
1111
  ],
838
1112
  properties: [
839
1113
  {
840
- name: 'name',
841
- layout: {
842
- positions: {
843
- lg: {
844
- colSpan: 6,
845
- order: 1,
846
- },
847
- },
848
- },
1114
+ name: 'code',
1115
+ layout: { positions: { lg: { colSpan: 2, order: 1 } } },
1116
+ },
1117
+ {
1118
+ name: 'title',
1119
+ layout: { positions: { lg: { colSpan: 6, order: 2 } } },
849
1120
  },
850
1121
  {
851
1122
  name: 'projectTypeId',
852
- layout: {
853
- positions: {
854
- lg: {
855
- colSpan: 6,
856
- order: 2,
857
- },
858
- },
859
- },
1123
+ layout: { positions: { lg: { colSpan: 4, order: 3 } } },
1124
+ },
1125
+ {
1126
+ name: 'description',
1127
+ layout: { positions: { lg: { colSpan: 12, order: 4 } } },
1128
+ },
1129
+ {
1130
+ name: 'customerId',
1131
+ layout: { positions: { lg: { colSpan: 6, order: 1 } } },
1132
+ },
1133
+ {
1134
+ name: 'partyLocationId',
1135
+ layout: { positions: { lg: { colSpan: 6, order: 2 } } },
1136
+ },
1137
+ {
1138
+ name: 'startDate',
1139
+ layout: { positions: { lg: { colSpan: 4, order: 1 } } },
1140
+ },
1141
+ {
1142
+ name: 'endDate',
1143
+ layout: { positions: { lg: { colSpan: 4, order: 2 } } },
860
1144
  },
861
1145
  {
862
1146
  name: 'dueDate',
863
- layout: {
864
- positions: {
865
- lg: {
866
- colSpan: 6,
867
- order: 3,
868
- },
869
- },
870
- },
1147
+ layout: { positions: { lg: { colSpan: 4, order: 3 } } },
871
1148
  },
872
1149
  {
873
- name: 'description',
874
- layout: {
875
- positions: {
876
- lg: {
877
- colSpan: 12,
878
- order: 4,
879
- },
880
- },
881
- },
1150
+ name: 'actualStartDate',
1151
+ layout: { positions: { lg: { colSpan: 4, order: 4 } } },
1152
+ },
1153
+ {
1154
+ name: 'actualEndDate',
1155
+ layout: { positions: { lg: { colSpan: 4, order: 5 } } },
882
1156
  },
883
1157
  ],
884
1158
  },
885
1159
  update: {
886
1160
  sections: [
887
- {
888
- id: 'basic-info',
889
- },
1161
+ { id: 'basic-info' },
1162
+ { id: 'organization-parties' },
1163
+ { id: 'schedule' },
890
1164
  ],
891
1165
  properties: [
892
1166
  {
893
- name: 'name',
894
- layout: {
895
- positions: {
896
- lg: {
897
- colSpan: 6,
898
- order: 1,
899
- },
900
- },
901
- },
1167
+ name: 'code',
1168
+ layout: { positions: { lg: { colSpan: 2, order: 1 } } },
902
1169
  },
903
1170
  {
904
- name: 'dueDate',
905
- layout: {
906
- positions: {
907
- lg: {
908
- colSpan: 6,
909
- order: 2,
910
- },
911
- },
912
- },
1171
+ name: 'title',
1172
+ layout: { positions: { lg: { colSpan: 6, order: 2 } } },
913
1173
  },
914
1174
  {
915
1175
  name: 'description',
916
- layout: {
917
- positions: {
918
- lg: {
919
- colSpan: 12,
920
- order: 3,
921
- },
922
- },
923
- },
1176
+ layout: { positions: { lg: { colSpan: 12, order: 3 } } },
1177
+ },
1178
+ {
1179
+ name: 'customerId',
1180
+ layout: { positions: { lg: { colSpan: 6, order: 1 } } },
1181
+ },
1182
+ {
1183
+ name: 'partyLocationId',
1184
+ layout: { positions: { lg: { colSpan: 6, order: 2 } } },
1185
+ },
1186
+ {
1187
+ name: 'startDate',
1188
+ layout: { positions: { lg: { colSpan: 4, order: 1 } } },
1189
+ },
1190
+ {
1191
+ name: 'endDate',
1192
+ layout: { positions: { lg: { colSpan: 4, order: 2 } } },
1193
+ },
1194
+ {
1195
+ name: 'dueDate',
1196
+ layout: { positions: { lg: { colSpan: 4, order: 3 } } },
1197
+ },
1198
+ {
1199
+ name: 'actualStartDate',
1200
+ layout: { positions: { lg: { colSpan: 4, order: 4 } } },
1201
+ },
1202
+ {
1203
+ name: 'actualEndDate',
1204
+ layout: { positions: { lg: { colSpan: 4, order: 5 } } },
924
1205
  },
925
1206
  ],
926
1207
  },
927
1208
  single: {
928
- title: '{{name}}',
1209
+ title: '{{title}}',
929
1210
  sections: [
930
- {
931
- id: 'basic-info',
932
- },
1211
+ { id: 'basic-info' },
1212
+ { id: 'organization-parties' },
1213
+ { id: 'schedule' },
933
1214
  ],
934
1215
  properties: [
935
1216
  {
936
- name: 'name',
937
- layout: {
938
- positions: {
939
- lg: {
940
- colSpan: 6,
941
- order: 1,
942
- },
943
- },
944
- },
1217
+ name: 'code',
1218
+ layout: { positions: { lg: { colSpan: 2, order: 1 } } },
1219
+ },
1220
+ {
1221
+ name: 'title',
1222
+ layout: { positions: { lg: { colSpan: 6, order: 2 } } },
945
1223
  },
946
1224
  {
947
1225
  name: 'projectTypeId',
948
- layout: {
949
- positions: {
950
- lg: {
951
- colSpan: 6,
952
- order: 2,
953
- },
954
- },
955
- },
1226
+ layout: { positions: { lg: { colSpan: 4, order: 3 } } },
1227
+ },
1228
+ {
1229
+ name: 'description',
1230
+ layout: { positions: { lg: { colSpan: 12, order: 4 } } },
1231
+ },
1232
+ {
1233
+ name: 'customerId',
1234
+ layout: { positions: { lg: { colSpan: 6, order: 1 } } },
1235
+ },
1236
+ {
1237
+ name: 'partyLocationId',
1238
+ layout: { positions: { lg: { colSpan: 6, order: 2 } } },
1239
+ },
1240
+ {
1241
+ name: 'startDate',
1242
+ layout: { positions: { lg: { colSpan: 4, order: 1 } } },
1243
+ },
1244
+ {
1245
+ name: 'endDate',
1246
+ layout: { positions: { lg: { colSpan: 4, order: 2 } } },
956
1247
  },
957
1248
  {
958
1249
  name: 'dueDate',
959
- layout: {
960
- positions: {
961
- lg: {
962
- colSpan: 6,
963
- order: 3,
964
- },
965
- },
966
- },
1250
+ layout: { positions: { lg: { colSpan: 4, order: 3 } } },
967
1251
  },
968
1252
  {
969
- name: 'description',
970
- layout: {
971
- positions: {
972
- lg: {
973
- colSpan: 12,
974
- order: 4,
975
- },
976
- },
977
- },
1253
+ name: 'actualStartDate',
1254
+ layout: { positions: { lg: { colSpan: 4, order: 4 } } },
1255
+ },
1256
+ {
1257
+ name: 'actualEndDate',
1258
+ layout: { positions: { lg: { colSpan: 4, order: 5 } } },
978
1259
  },
979
1260
  ],
980
1261
  actions: [...entityMasterRecordActions()],
@@ -983,7 +1264,7 @@ async function projectFactory() {
983
1264
  actions: [...entityMasterCrudActions()],
984
1265
  views: [
985
1266
  createAllQueryView({
986
- sorts: [{ name: 'projectName', dir: 'asc' }],
1267
+ sorts: [{ name: 'title', dir: 'asc' }],
987
1268
  }),
988
1269
  ],
989
1270
  },
@@ -1031,12 +1312,12 @@ async function projectMemeberFactory() {
1031
1312
  type: AXPWidgetsList.Editors.LookupBox,
1032
1313
  options: {
1033
1314
  entity: `${RootConfig.module.name}.${RootConfig.entities.project.name}`,
1034
- textField: 'projectName',
1315
+ textField: 'title',
1035
1316
  valueField: 'id',
1036
1317
  look: 'select',
1037
1318
  expose: [
1038
1319
  { source: 'id', target: 'project.id' },
1039
- { source: 'projectName', target: 'project.displayName' },
1320
+ { source: 'title', target: 'project.displayName' },
1040
1321
  { source: 'projectTypeId', target: 'project.projectTypeId' },
1041
1322
  ],
1042
1323
  },
@@ -1170,7 +1451,6 @@ var index$2 = /*#__PURE__*/Object.freeze({
1170
1451
  });
1171
1452
 
1172
1453
  async function projectTypeFactory() {
1173
- const i18n = RootConfig.config.i18n;
1174
1454
  const entityDef = {
1175
1455
  module: RootConfig.module.name,
1176
1456
  name: RootConfig.entities.projectType.name,
@@ -1179,6 +1459,19 @@ async function projectTypeFactory() {
1179
1459
  plugins: [
1180
1460
  {
1181
1461
  name: 'meta-data-builder',
1462
+ options: {
1463
+ display: {
1464
+ section: { enabled: false },
1465
+ page: { enabled: true },
1466
+ },
1467
+ },
1468
+ },
1469
+ {
1470
+ name: 'category',
1471
+ options: {
1472
+ appearance: { icon: true, color: true },
1473
+ metaData: { enabled: true },
1474
+ },
1182
1475
  },
1183
1476
  ],
1184
1477
  formats: {
@@ -1195,19 +1488,11 @@ async function projectTypeFactory() {
1195
1488
  title: RootConfig.entities.projectTypeRoleType.titlePlural,
1196
1489
  columns: ['title', 'description'],
1197
1490
  conditions: [{ name: 'projectTypeId', operator: { type: 'equal' }, value: '{{ context.eval("id") }}' }],
1198
- actions: [...entityDetailsCrudActions('projectTypeId')]
1199
- // {
1200
- // title: '@general:actions.create.title',
1201
- // command: { name: 'Entity:Create', options: { process: { redirect: false, canCreateNewOne: true } } },
1202
- // priority: 'primary',
1203
- // type: 'create',
1204
- // scope: AXPEntityCommandScope.TypeLevel,
1205
- // },
1206
- ,
1491
+ actions: [...entityDetailsCrudActions('projectTypeId')],
1207
1492
  layout: {
1208
1493
  type: 'page-list',
1209
1494
  },
1210
- }
1495
+ },
1211
1496
  ],
1212
1497
  groups: [
1213
1498
  {
@@ -1246,8 +1531,8 @@ async function projectTypeFactory() {
1246
1531
  ],
1247
1532
  },
1248
1533
  {
1249
- name: 'taskTypeIds',
1250
- title: '@workflow-management:workflow-definitions.entities.workflow-definition.plural',
1534
+ name: 'description',
1535
+ title: '@general:terms.common.description',
1251
1536
  groupId: 'section',
1252
1537
  options: {
1253
1538
  sort: {
@@ -1263,58 +1548,63 @@ async function projectTypeFactory() {
1263
1548
  },
1264
1549
  },
1265
1550
  schema: {
1266
- dataType: 'array',
1551
+ dataType: 'string',
1552
+ interface: {
1553
+ type: AXPWidgetsCatalog.largeText,
1554
+ },
1555
+ },
1556
+ },
1557
+ {
1558
+ name: 'allowedTaskTypeIds',
1559
+ title: '@project-management:projects.project-type-allowed-task-types.plural',
1560
+ groupId: 'section',
1561
+ schema: {
1562
+ dataType: 'object',
1267
1563
  interface: {
1268
1564
  type: AXPWidgetsCatalog.lookup,
1269
1565
  options: {
1270
- entity: 'WorkflowManagement.WorkflowDefinition',
1566
+ entity: 'TaskManagement.TaskType',
1567
+ textField: 'title',
1568
+ valueField: 'id',
1569
+ columns: ['name', 'title'],
1271
1570
  multiple: true,
1272
1571
  expose: [
1273
- { source: 'name', target: 'workflows.{name}' },
1274
- { source: 'title', target: 'workflows.{title}' },
1572
+ { source: 'id', target: 'allowedTaskTypes.{id}' },
1573
+ { source: 'title', target: 'allowedTaskTypes.{title}' },
1574
+ { source: 'name', target: 'allowedTaskTypes.{name}' },
1275
1575
  ],
1276
1576
  },
1277
1577
  },
1278
1578
  },
1279
- },
1280
- {
1281
- name: 'description',
1282
- title: '@general:terms.common.description',
1283
- groupId: 'section',
1284
1579
  options: {
1285
- sort: {
1286
- enabled: true,
1287
- },
1288
- filter: {
1289
- advance: {
1290
- enabled: true,
1291
- },
1292
- inline: {
1293
- enabled: true,
1294
- },
1295
- },
1580
+ sort: { enabled: false },
1581
+ filter: { advance: { enabled: true }, inline: { enabled: false } },
1296
1582
  },
1583
+ },
1584
+ {
1585
+ name: 'allowedTaskTypes',
1586
+ title: '@project-management:projects.project-type-allowed-task-types.plural',
1297
1587
  schema: {
1298
- dataType: 'string',
1588
+ dataType: 'array',
1299
1589
  interface: {
1300
- type: AXPWidgetsCatalog.largeText,
1590
+ type: AXPWidgetsCatalog.text,
1301
1591
  },
1302
- }
1592
+ },
1593
+ options: {
1594
+ sort: { enabled: false },
1595
+ filter: { advance: { enabled: false }, inline: { enabled: false } },
1596
+ },
1303
1597
  },
1304
1598
  ],
1305
1599
  columns: [
1306
1600
  { name: 'title' },
1307
- { name: 'taskTypeIds', options: { dataPath: 'workflows' } },
1308
1601
  { name: 'description' },
1602
+ { name: 'allowedTaskTypeIds', options: { dataPath: 'allowedTaskTypes' } },
1309
1603
  ],
1310
1604
  interfaces: {
1311
1605
  master: {
1312
1606
  create: {
1313
- sections: [
1314
- {
1315
- id: 'section',
1316
- },
1317
- ],
1607
+ sections: [{ id: 'section' }],
1318
1608
  properties: [
1319
1609
  {
1320
1610
  name: 'title',
@@ -1328,23 +1618,22 @@ async function projectTypeFactory() {
1328
1618
  },
1329
1619
  },
1330
1620
  {
1331
- name: 'taskTypeIds',
1332
- dataPath: 'taskTypes',
1621
+ name: 'description',
1333
1622
  layout: {
1334
1623
  positions: {
1335
1624
  lg: {
1336
- colSpan: 6,
1625
+ colSpan: 12,
1337
1626
  order: 2,
1338
1627
  },
1339
1628
  },
1340
1629
  },
1341
1630
  },
1342
1631
  {
1343
- name: 'description',
1632
+ name: 'allowedTaskTypeIds',
1344
1633
  layout: {
1345
1634
  positions: {
1346
1635
  lg: {
1347
- colSpan: 6,
1636
+ colSpan: 12,
1348
1637
  order: 3,
1349
1638
  },
1350
1639
  },
@@ -1353,11 +1642,7 @@ async function projectTypeFactory() {
1353
1642
  ],
1354
1643
  },
1355
1644
  update: {
1356
- sections: [
1357
- {
1358
- id: 'section',
1359
- },
1360
- ],
1645
+ sections: [{ id: 'section' }],
1361
1646
  properties: [
1362
1647
  {
1363
1648
  name: 'title',
@@ -1371,23 +1656,22 @@ async function projectTypeFactory() {
1371
1656
  },
1372
1657
  },
1373
1658
  {
1374
- name: 'taskTypeIds',
1375
- dataPath: 'taskTypes',
1659
+ name: 'description',
1376
1660
  layout: {
1377
1661
  positions: {
1378
1662
  lg: {
1379
- colSpan: 6,
1663
+ colSpan: 12,
1380
1664
  order: 2,
1381
1665
  },
1382
1666
  },
1383
1667
  },
1384
1668
  },
1385
1669
  {
1386
- name: 'description',
1670
+ name: 'allowedTaskTypeIds',
1387
1671
  layout: {
1388
1672
  positions: {
1389
1673
  lg: {
1390
- colSpan: 6,
1674
+ colSpan: 12,
1391
1675
  order: 3,
1392
1676
  },
1393
1677
  },
@@ -1422,23 +1706,22 @@ async function projectTypeFactory() {
1422
1706
  },
1423
1707
  },
1424
1708
  {
1425
- name: 'taskTypeIds',
1426
- dataPath: 'taskTypes',
1709
+ name: 'description',
1427
1710
  layout: {
1428
1711
  positions: {
1429
1712
  lg: {
1430
- colSpan: 6,
1713
+ colSpan: 12,
1431
1714
  order: 2,
1432
1715
  },
1433
1716
  },
1434
1717
  },
1435
1718
  },
1436
1719
  {
1437
- name: 'description',
1720
+ name: 'allowedTaskTypeIds',
1438
1721
  layout: {
1439
1722
  positions: {
1440
1723
  lg: {
1441
- colSpan: 6,
1724
+ colSpan: 12,
1442
1725
  order: 3,
1443
1726
  },
1444
1727
  },