@acorex-platform/module-platform-management-client 0.0.38 → 0.0.46

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 (87) hide show
  1. package/fesm2022/{acorex-platform-module-platform-management-client-acorex-platform-module-platform-management-client-BGVhn6wv.mjs → acorex-platform-module-platform-management-client-acorex-platform-module-platform-management-client-YuJijjKh.mjs} +465 -101
  2. package/fesm2022/acorex-platform-module-platform-management-client-acorex-platform-module-platform-management-client-YuJijjKh.mjs.map +1 -0
  3. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-command-definition.mjs +20 -0
  4. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-command-definition.mjs.map +1 -1
  5. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-entity-access-policy.mjs +20 -0
  6. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-entity-access-policy.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-entity-definition.mjs +1499 -30
  8. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-entity-definition.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-module-definition.mjs +396 -0
  10. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-module-definition.mjs.map +1 -0
  11. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-plugin-definition.mjs +20 -0
  12. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-plugin-definition.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-query-definition.mjs +49 -1
  14. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-query-definition.mjs.map +1 -1
  15. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-token.mjs +20 -0
  16. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-token.mjs.map +1 -1
  17. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-widget.mjs +20 -0
  18. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entities-widget.mjs.map +1 -1
  19. package/fesm2022/{acorex-platform-module-platform-management-client-contracts-entity-catalog-acorex-platform-module-platform-management-client-contracts-entity-catalog-BOwC5Ns9.mjs → acorex-platform-module-platform-management-client-contracts-entity-catalog-acorex-platform-module-platform-management-client-contracts-entity-catalog-HWczTPH2.mjs} +15 -8
  20. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-acorex-platform-module-platform-management-client-contracts-entity-catalog-HWczTPH2.mjs.map +1 -0
  21. package/fesm2022/{acorex-platform-module-platform-management-client-contracts-entity-catalog-command-definition.entity-CdvQlwAk.mjs → acorex-platform-module-platform-management-client-contracts-entity-catalog-command-definition.entity-C3B1_QMs.mjs} +16 -2
  22. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-command-definition.entity-C3B1_QMs.mjs.map +1 -0
  23. package/fesm2022/{acorex-platform-module-platform-management-client-contracts-entity-catalog-entity-access-policy.entity-Dye4aSKE.mjs → acorex-platform-module-platform-management-client-contracts-entity-catalog-entity-access-policy.entity-BPkJloHy.mjs} +16 -2
  24. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-entity-access-policy.entity-BPkJloHy.mjs.map +1 -0
  25. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-entity-definition.entity-BL1I9pmK.mjs +1621 -0
  26. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-entity-definition.entity-BL1I9pmK.mjs.map +1 -0
  27. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-module-definition.entity-Cknl0vbc.mjs +299 -0
  28. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-module-definition.entity-Cknl0vbc.mjs.map +1 -0
  29. package/fesm2022/{acorex-platform-module-platform-management-client-contracts-entity-catalog-plugin-definition.entity-CwU5hMjI.mjs → acorex-platform-module-platform-management-client-contracts-entity-catalog-plugin-definition.entity-BxABTl8L.mjs} +16 -2
  30. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-plugin-definition.entity-BxABTl8L.mjs.map +1 -0
  31. package/fesm2022/{acorex-platform-module-platform-management-client-contracts-entity-catalog-query-definition.entity-DGK684Q1.mjs → acorex-platform-module-platform-management-client-contracts-entity-catalog-query-definition.entity-Cv6HVQOU.mjs} +45 -3
  32. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-query-definition.entity-Cv6HVQOU.mjs.map +1 -0
  33. package/fesm2022/{acorex-platform-module-platform-management-client-contracts-entity-catalog-token.entity-DI_k6-ha.mjs → acorex-platform-module-platform-management-client-contracts-entity-catalog-token.entity-BV8iSuoK.mjs} +16 -2
  34. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-token.entity-BV8iSuoK.mjs.map +1 -0
  35. package/fesm2022/{acorex-platform-module-platform-management-client-contracts-entity-catalog-widget.entity-C18msniH.mjs → acorex-platform-module-platform-management-client-contracts-entity-catalog-widget.entity-BYH6SIqU.mjs} +16 -2
  36. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-widget.entity-BYH6SIqU.mjs.map +1 -0
  37. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog.mjs +1 -1
  38. package/fesm2022/acorex-platform-module-platform-management-client-contracts.mjs +1664 -1
  39. package/fesm2022/acorex-platform-module-platform-management-client-contracts.mjs.map +1 -1
  40. package/fesm2022/acorex-platform-module-platform-management-client-create-user-query-contract.util-D_af2BUi.mjs +586 -0
  41. package/fesm2022/acorex-platform-module-platform-management-client-create-user-query-contract.util-D_af2BUi.mjs.map +1 -0
  42. package/fesm2022/{acorex-platform-module-platform-management-client-create-user-query.command-9Ku7C1BC.mjs → acorex-platform-module-platform-management-client-create-user-query.command-Bh49QHkl.mjs} +374 -324
  43. package/fesm2022/acorex-platform-module-platform-management-client-create-user-query.command-Bh49QHkl.mjs.map +1 -0
  44. package/fesm2022/acorex-platform-module-platform-management-client-entity-definition-form-page.component-BgBWob9p.mjs +329 -0
  45. package/fesm2022/acorex-platform-module-platform-management-client-entity-definition-form-page.component-BgBWob9p.mjs.map +1 -0
  46. package/fesm2022/acorex-platform-module-platform-management-client-entity-definition-form-page.provider-hLzgoJu3.mjs +23 -0
  47. package/fesm2022/acorex-platform-module-platform-management-client-entity-definition-form-page.provider-hLzgoJu3.mjs.map +1 -0
  48. package/fesm2022/acorex-platform-module-platform-management-client-list-registered-entities.query-CZM6JQou.mjs +197 -0
  49. package/fesm2022/acorex-platform-module-platform-management-client-list-registered-entities.query-CZM6JQou.mjs.map +1 -0
  50. package/fesm2022/acorex-platform-module-platform-management-client-local-entities.mjs +1 -0
  51. package/fesm2022/acorex-platform-module-platform-management-client-local-entities.mjs.map +1 -1
  52. package/fesm2022/{acorex-platform-module-platform-management-client-menu-list.component-uF5w1c7t.mjs → acorex-platform-module-platform-management-client-menu-list.component-iMEnFPEY.mjs} +2 -2
  53. package/fesm2022/{acorex-platform-module-platform-management-client-menu-list.component-uF5w1c7t.mjs.map → acorex-platform-module-platform-management-client-menu-list.component-iMEnFPEY.mjs.map} +1 -1
  54. package/fesm2022/acorex-platform-module-platform-management-client-query-contract-widget-column.component-COfOzMGh.mjs +45 -0
  55. package/fesm2022/acorex-platform-module-platform-management-client-query-contract-widget-column.component-COfOzMGh.mjs.map +1 -0
  56. package/fesm2022/acorex-platform-module-platform-management-client-query-contract-widget-edit.component-BW2pBOeg.mjs +166 -0
  57. package/fesm2022/acorex-platform-module-platform-management-client-query-contract-widget-edit.component-BW2pBOeg.mjs.map +1 -0
  58. package/fesm2022/acorex-platform-module-platform-management-client-query-contract-widget-view.component-DD9ETjFD.mjs +45 -0
  59. package/fesm2022/acorex-platform-module-platform-management-client-query-contract-widget-view.component-DD9ETjFD.mjs.map +1 -0
  60. package/fesm2022/{acorex-platform-module-platform-management-client-rest-api-generator-widget-column.component-B0g6dweQ.mjs → acorex-platform-module-platform-management-client-rest-api-generator-widget-column.component-DRkE2a7n.mjs} +2 -2
  61. package/fesm2022/{acorex-platform-module-platform-management-client-rest-api-generator-widget-column.component-B0g6dweQ.mjs.map → acorex-platform-module-platform-management-client-rest-api-generator-widget-column.component-DRkE2a7n.mjs.map} +1 -1
  62. package/fesm2022/{acorex-platform-module-platform-management-client-rest-api-generator-widget-edit.component-A0v5MWRU.mjs → acorex-platform-module-platform-management-client-rest-api-generator-widget-edit.component-CXI6fJi3.mjs} +2 -3
  63. package/fesm2022/{acorex-platform-module-platform-management-client-rest-api-generator-widget-edit.component-A0v5MWRU.mjs.map → acorex-platform-module-platform-management-client-rest-api-generator-widget-edit.component-CXI6fJi3.mjs.map} +1 -1
  64. package/fesm2022/{acorex-platform-module-platform-management-client-rest-api-generator-widget-view.component-RR5zcsnI.mjs → acorex-platform-module-platform-management-client-rest-api-generator-widget-view.component-C3iHgoC2.mjs} +2 -2
  65. package/fesm2022/{acorex-platform-module-platform-management-client-rest-api-generator-widget-view.component-RR5zcsnI.mjs.map → acorex-platform-module-platform-management-client-rest-api-generator-widget-view.component-C3iHgoC2.mjs.map} +1 -1
  66. package/fesm2022/acorex-platform-module-platform-management-client-run-user-query.command-BzNa3B48.mjs +144 -0
  67. package/fesm2022/acorex-platform-module-platform-management-client-run-user-query.command-BzNa3B48.mjs.map +1 -0
  68. package/fesm2022/acorex-platform-module-platform-management-client.mjs +1 -1
  69. package/package.json +7 -3
  70. package/types/acorex-platform-module-platform-management-client-contracts-entities-module-definition.d.ts +5 -0
  71. package/types/acorex-platform-module-platform-management-client-contracts.d.ts +225 -5
  72. package/types/acorex-platform-module-platform-management-client.d.ts +35 -3
  73. package/fesm2022/acorex-platform-module-platform-management-client-acorex-platform-module-platform-management-client-BGVhn6wv.mjs.map +0 -1
  74. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-acorex-platform-module-platform-management-client-contracts-entity-catalog-BOwC5Ns9.mjs.map +0 -1
  75. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-command-definition.entity-CdvQlwAk.mjs.map +0 -1
  76. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-entity-access-policy.entity-Dye4aSKE.mjs.map +0 -1
  77. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-entity-definition.entity-CcJ58vfr.mjs +0 -158
  78. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-entity-definition.entity-CcJ58vfr.mjs.map +0 -1
  79. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-plugin-definition.entity-CwU5hMjI.mjs.map +0 -1
  80. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-query-definition.entity-DGK684Q1.mjs.map +0 -1
  81. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-token.entity-DI_k6-ha.mjs.map +0 -1
  82. package/fesm2022/acorex-platform-module-platform-management-client-contracts-entity-catalog-widget.entity-C18msniH.mjs.map +0 -1
  83. package/fesm2022/acorex-platform-module-platform-management-client-create-user-query.command-9Ku7C1BC.mjs.map +0 -1
  84. package/fesm2022/acorex-platform-module-platform-management-client-create-user-query.types-DdygAori.mjs +0 -71
  85. package/fesm2022/acorex-platform-module-platform-management-client-create-user-query.types-DdygAori.mjs.map +0 -1
  86. package/fesm2022/acorex-platform-module-platform-management-client-list-registered-entities.query-DjStd3a8.mjs +0 -136
  87. package/fesm2022/acorex-platform-module-platform-management-client-list-registered-entities.query-DjStd3a8.mjs.map +0 -1
@@ -1,25 +1,27 @@
1
1
  import { AXPSessionService, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/auth';
2
2
  import { AXPSettingsService, AXPMenuProviderService, AXPTokenDefinitionService, AXP_TOKEN_DEFINITION_PROVIDER, AXP_PROTECTED_ROUTE_GUARDS, AXP_MENU_MIDDLEWARE, AXP_MENU_PROVIDER } from '@acorex-platform/framework-client/common';
3
3
  import { AXPEntityService, AXP_ENTITY_MODIFIER } from '@acorex-platform/framework-client/layout/entity';
4
- import { AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, AXP_MODULE_MANIFEST_PROVIDER, AXP_FEATURE_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/core';
4
+ import { AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, AXP_MODULE_MANIFEST_PROVIDER, AXP_FEATURE_DEFINITION_PROVIDER, provideLazyProvider } from '@acorex-platform/framework-client/core';
5
5
  import { AXPRootLayoutComponent } from '@acorex-platform/framework-client/themes/default';
6
6
  import { AXP_WIDGETS_EDITOR_CATEGORY, AXPWidgetCoreModule, AXP_WIDGET_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/layout/widget-core';
7
- import { provideCommandSetups, AXPCommandExecutor, provideQuerySetups } from '@acorex-platform/framework-client/runtime';
7
+ import { AXPMenuCustomizerService, AXP_MENU_CUSTOMIZER_SERVICE, AXP_PAGE_COMPONENT_PROVIDER } from '@acorex-platform/framework-client/layout/components';
8
+ import { provideCommandSetups, AXPCommandExecutor, AXPQueryService, provideQuerySetups } from '@acorex-platform/framework-client/runtime';
8
9
  import * as i0 from '@angular/core';
9
10
  import { Injectable, inject, NgModule, Injector, input, output, viewChild, signal, DestroyRef, computed, afterNextRender, effect, ViewEncapsulation, ChangeDetectionStrategy, Component, Directive } from '@angular/core';
10
11
  import { ROUTES } from '@angular/router';
11
12
  import { AXPWidgetGroupEnum } from '@acorex-platform/framework-shared/widget-core';
12
13
  import { AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_READONLY_PROPERTY, AXP_DISABLED_PROPERTY } from '@acorex-platform/framework-client/layout/widgets';
13
- import { AXPPlatformManagementFeatureKeys, RootConfig, AXM_TOKEN_RESOLVE_COMMAND_KEY, AXPApplicationsPlatformPermissionKeys, AXPPlatformManagementMenuKeys } from '@acorex-platform/module-platform-management-client/contracts';
14
- import { AXPPlatformScope, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';
15
- import { AXPMenuCustomizerService, AXP_MENU_CUSTOMIZER_SERVICE } from '@acorex-platform/framework-client/layout/components';
14
+ import { RootConfig, AXPPlatformManagementFeatureKeys, AXM_TOKEN_RESOLVE_COMMAND_KEY, AXPApplicationsPlatformPermissionKeys, AXPPlatformManagementMenuKeys } from '@acorex-platform/module-platform-management-client/contracts';
15
+ import { AXPPlatformScope, runtimeCommandPayloadData, runtimeQueryCollectionData } from '@acorex-platform/framework-shared/core';
16
16
  import { cloneDeep } from 'lodash';
17
17
  import { AXDialogService } from '@acorex/components/dialog';
18
18
  import { AXTranslationService } from '@acorex/core/translation';
19
19
  import { SwUpdate } from '@angular/service-worker';
20
+ import { ENTITY_QUERY_DEFAULT } from '@acorex-platform/framework-shared/runtime';
20
21
  import { AXPCommonMenuKeys, AXPCommonPermissionGroupKeys } from '@acorex-platform/module-common-client/contracts';
21
22
  import { AXP_ENTITY_DEFINITION_CRUD_SERVICE } from '@acorex-platform/framework-client/domain';
22
23
  import { commandDefinitionEntityFactory } from '@acorex-platform/module-platform-management-client/contracts/entities/command-definition';
24
+ import { moduleDefinitionEntityFactory } from '@acorex-platform/module-platform-management-client/contracts/entities/module-definition';
23
25
  import { entityDefinitionEntityFactory } from '@acorex-platform/module-platform-management-client/contracts/entities/entity-definition';
24
26
  import { pluginDefinitionEntityFactory } from '@acorex-platform/module-platform-management-client/contracts/entities/plugin-definition';
25
27
  import { queryDefinitionEntityFactory } from '@acorex-platform/module-platform-management-client/contracts/entities/query-definition';
@@ -33,6 +35,206 @@ import { AXDecoratorModule } from '@acorex/components/decorators';
33
35
  import * as i1 from '@angular/common';
34
36
  import { CommonModule } from '@angular/common';
35
37
 
38
+ const CREATE_USER_QUERY_COMMAND_KEY = 'PlatformManagement:CreateUserQuery';
39
+ const CREATE_USER_QUERY_WIZARD_NAME = 'create-user-query-wizard';
40
+ const CREATE_USER_QUERY_ENTITY_CATALOG = `${RootConfig.module.name}.${RootConfig.entities.entityDefinition.name}`;
41
+ const CREATE_USER_QUERY_I18N = {
42
+ titles: {
43
+ entity: '@platform-management:query-definitions.wizard.create.titles.entity',
44
+ static: '@platform-management:query-definitions.wizard.create.titles.static-list',
45
+ api: '@platform-management:query-definitions.wizard.create.titles.external-api',
46
+ advanced: '@platform-management:query-definitions.wizard.create.titles.advanced',
47
+ },
48
+ steps: {
49
+ source: '@platform-management:query-definitions.wizard.create.steps.source',
50
+ entity: '@platform-management:query-definitions.wizard.create.steps.entity',
51
+ fields: '@platform-management:query-definitions.wizard.create.steps.fields',
52
+ contract: '@platform-management:query-definitions.wizard.create.steps.contract',
53
+ },
54
+ fields: {
55
+ entity: '@platform-management:query-definitions.wizard.create.fields.entity',
56
+ fields: '@platform-management:query-definitions.wizard.create.fields.fields',
57
+ hostFields: '@platform-management:query-definitions.wizard.create.fields.host-fields',
58
+ value: '@platform-management:query-definitions.wizard.create.fields.value',
59
+ title: '@platform-management:query-definitions.wizard.create.fields.title',
60
+ queryName: '@platform-management:query-definitions.wizard.create.fields.query-name',
61
+ catalogTitle: '@platform-management:query-definitions.wizard.create.fields.catalog-title',
62
+ description: '@platform-management:query-definitions.wizard.create.fields.description',
63
+ identity: '@platform-management:query-definitions.wizard.create.fields.identity',
64
+ capabilities: '@platform-management:query-definitions.wizard.create.fields.capabilities',
65
+ predicates: '@platform-management:query-definitions.wizard.create.fields.predicates',
66
+ kind: '@platform-management:query-definitions.entities.query-definition.fields.kind.title',
67
+ valueType: '@platform-management:query-definitions.entities.query-definition.fields.value-type.title',
68
+ measure: '@platform-management:query-definitions.wizard.create.fields.measure',
69
+ measureField: '@platform-management:query-definitions.wizard.create.fields.measure-field',
70
+ filterableFields: '@platform-management:query-definitions.wizard.create.fields.filterable-fields',
71
+ sortableFields: '@platform-management:query-definitions.wizard.create.fields.sortable-fields',
72
+ paging: '@platform-management:query-definitions.wizard.create.fields.paging',
73
+ valueField: '@platform-management:query-definitions.wizard.create.fields.value-field',
74
+ textField: '@platform-management:query-definitions.wizard.create.fields.text-field',
75
+ connection: '@platform-management:query-definitions.wizard.create.fields.connection',
76
+ method: '@platform-management:query-definitions.wizard.create.fields.method',
77
+ path: '@platform-management:query-definitions.wizard.create.fields.path',
78
+ request: '@platform-management:query-definitions.wizard.create.fields.request',
79
+ sample: '@platform-management:query-definitions.wizard.create.fields.sample',
80
+ status: '@platform-management:query-definitions.wizard.create.fields.status',
81
+ response: '@platform-management:query-definitions.wizard.create.fields.response',
82
+ },
83
+ import: {
84
+ title: '@platform-management:query-definitions.wizard.create.import.title',
85
+ placeholder: '@platform-management:query-definitions.wizard.create.import.placeholder',
86
+ apply: '@platform-management:query-definitions.wizard.create.import.apply',
87
+ parseFailed: '@platform-management:query-definitions.wizard.create.errors.parse-failed',
88
+ },
89
+ methods: {
90
+ get: '@platform-management:query-definitions.wizard.create.methods.get',
91
+ post: '@platform-management:query-definitions.wizard.create.methods.post',
92
+ },
93
+ placeholders: {
94
+ contract: '@platform-management:query-definitions.wizard.create.placeholders.contract',
95
+ contractNext: '@platform-management:query-definitions.wizard.create.placeholders.contract-next',
96
+ identity: '@platform-management:query-definitions.wizard.create.placeholders.identity',
97
+ kind: '@platform-management:query-definitions.wizard.create.placeholders.kind',
98
+ valueType: '@platform-management:query-definitions.wizard.create.placeholders.value-type',
99
+ measure: '@platform-management:query-definitions.wizard.create.placeholders.measure',
100
+ predicates: '@platform-management:query-definitions.wizard.create.placeholders.predicates',
101
+ capabilities: '@platform-management:query-definitions.wizard.create.placeholders.capabilities',
102
+ filterableFields: '@platform-management:query-definitions.wizard.create.placeholders.filterable-fields',
103
+ sortableFields: '@platform-management:query-definitions.wizard.create.placeholders.sortable-fields',
104
+ paging: '@platform-management:query-definitions.wizard.create.placeholders.paging',
105
+ advanced: '@platform-management:query-definitions.wizard.create.placeholders.advanced',
106
+ itemsHint: '@platform-management:query-definitions.wizard.create.items-hint',
107
+ entityFields: '@platform-management:query-definitions.wizard.create.placeholders.entity-fields',
108
+ fieldsNext: '@platform-management:query-definitions.wizard.create.placeholders.fields-next',
109
+ selectedEntityHint: '@platform-management:query-definitions.wizard.create.placeholders.selected-entity-hint',
110
+ relatedTo: '@platform-management:query-definitions.wizard.create.placeholders.related-to',
111
+ apiFieldsNext: '@platform-management:query-definitions.wizard.create.placeholders.api-fields-next',
112
+ selectedApiHint: '@platform-management:query-definitions.wizard.create.placeholders.selected-api-hint',
113
+ apiFields: '@platform-management:query-definitions.wizard.create.placeholders.api-fields',
114
+ apiTestOk: '@platform-management:query-definitions.wizard.create.placeholders.api-test-ok',
115
+ persistOk: '@platform-management:query-definitions.wizard.create.placeholders.persist-ok',
116
+ },
117
+ errors: {
118
+ entityRequired: '@platform-management:query-definitions.wizard.create.errors.entity-required',
119
+ entityLoadFailed: '@platform-management:query-definitions.wizard.create.errors.entity-load-failed',
120
+ fieldsRequired: '@platform-management:query-definitions.wizard.create.errors.fields-required',
121
+ staticRequired: '@platform-management:query-definitions.wizard.create.errors.static-required',
122
+ apiConnectionRequired: '@platform-management:query-definitions.wizard.create.errors.api-connection-required',
123
+ apiPathRequired: '@platform-management:query-definitions.wizard.create.errors.api-path-required',
124
+ apiUrlRequired: '@platform-management:query-definitions.wizard.create.errors.api-url-required',
125
+ apiTestFailed: '@platform-management:query-definitions.wizard.create.errors.api-test-failed',
126
+ apiTestNetwork: '@platform-management:query-definitions.wizard.create.errors.api-test-network',
127
+ contractNameRequired: '@platform-management:query-definitions.wizard.create.errors.contract-name-required',
128
+ contractTitleRequired: '@platform-management:query-definitions.wizard.create.errors.contract-title-required',
129
+ contractBindingInvalid: '@platform-management:query-definitions.wizard.create.errors.contract-binding-invalid',
130
+ contractMeasureInvalid: '@platform-management:query-definitions.wizard.create.errors.contract-measure-invalid',
131
+ persistFailed: '@platform-management:query-definitions.wizard.create.errors.persist-failed',
132
+ persistDuplicate: '@platform-management:query-definitions.wizard.create.errors.persist-duplicate',
133
+ },
134
+ widget: {
135
+ title: '@platform-management:query-definitions.wizard.create.contract-editor.title',
136
+ description: '@platform-management:query-definitions.wizard.create.contract-editor.description',
137
+ },
138
+ };
139
+ const USER_QUERY_KIND_OPTIONS = [
140
+ {
141
+ value: 'value',
142
+ text: '@platform-management:query-definitions.entities.query-definition.fields.kind.options.value',
143
+ },
144
+ {
145
+ value: 'object',
146
+ text: '@platform-management:query-definitions.entities.query-definition.fields.kind.options.object',
147
+ },
148
+ {
149
+ value: 'collection',
150
+ text: '@platform-management:query-definitions.entities.query-definition.fields.kind.options.collection',
151
+ },
152
+ ];
153
+ const USER_QUERY_VALUE_TYPE_OPTIONS = [
154
+ {
155
+ value: 'string',
156
+ text: '@platform-management:query-definitions.entities.query-definition.fields.value-type.options.string',
157
+ },
158
+ {
159
+ value: 'number',
160
+ text: '@platform-management:query-definitions.entities.query-definition.fields.value-type.options.number',
161
+ },
162
+ {
163
+ value: 'boolean',
164
+ text: '@platform-management:query-definitions.entities.query-definition.fields.value-type.options.boolean',
165
+ },
166
+ {
167
+ value: 'date',
168
+ text: '@platform-management:query-definitions.entities.query-definition.fields.value-type.options.date',
169
+ },
170
+ {
171
+ value: 'datetime',
172
+ text: '@platform-management:query-definitions.entities.query-definition.fields.value-type.options.datetime',
173
+ },
174
+ {
175
+ value: 'json',
176
+ text: '@platform-management:query-definitions.entities.query-definition.fields.value-type.options.json',
177
+ },
178
+ ];
179
+ const USER_QUERY_MEASURE_REDUCER_OPTIONS = [
180
+ {
181
+ value: 'count',
182
+ text: '@platform-management:query-definitions.wizard.create.fields.measure-reducers.count',
183
+ },
184
+ {
185
+ value: 'sum',
186
+ text: '@platform-management:query-definitions.wizard.create.fields.measure-reducers.sum',
187
+ },
188
+ {
189
+ value: 'avg',
190
+ text: '@platform-management:query-definitions.wizard.create.fields.measure-reducers.avg',
191
+ },
192
+ {
193
+ value: 'min',
194
+ text: '@platform-management:query-definitions.wizard.create.fields.measure-reducers.min',
195
+ },
196
+ {
197
+ value: 'max',
198
+ text: '@platform-management:query-definitions.wizard.create.fields.measure-reducers.max',
199
+ },
200
+ ];
201
+ //#endregion
202
+
203
+ const QUERY_CONTRACT_WIDGET_NAME = 'query-contract-editor';
204
+
205
+ //#region ----- Imports -----
206
+ //#endregion
207
+ //#region ----- Config -----
208
+ const AXMQueryContractWidget = {
209
+ name: QUERY_CONTRACT_WIDGET_NAME,
210
+ title: CREATE_USER_QUERY_I18N.widget.title,
211
+ description: CREATE_USER_QUERY_I18N.widget.description,
212
+ icon: 'fa-light fa-file-contract',
213
+ categories: AXP_WIDGETS_EDITOR_CATEGORY,
214
+ groups: [AXPWidgetGroupEnum.UtilityWidget],
215
+ type: 'editor',
216
+ defaultFilterWidgetName: 'string-filter',
217
+ options: {
218
+ needLabel: false,
219
+ },
220
+ properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_READONLY_PROPERTY, AXP_DISABLED_PROPERTY],
221
+ components: {
222
+ edit: {
223
+ component: () => import('./acorex-platform-module-platform-management-client-query-contract-widget-edit.component-BW2pBOeg.mjs').then((c) => c.AXMQueryContractWidgetEditComponent),
224
+ },
225
+ designer: {
226
+ component: () => import('./acorex-platform-module-platform-management-client-query-contract-widget-edit.component-BW2pBOeg.mjs').then((c) => c.AXMQueryContractWidgetEditComponent),
227
+ },
228
+ view: {
229
+ component: () => import('./acorex-platform-module-platform-management-client-query-contract-widget-view.component-DD9ETjFD.mjs').then((c) => c.AXMQueryContractWidgetViewComponent),
230
+ },
231
+ column: {
232
+ component: () => import('./acorex-platform-module-platform-management-client-query-contract-widget-column.component-COfOzMGh.mjs').then((c) => c.AXMQueryContractWidgetColumnComponent),
233
+ },
234
+ },
235
+ };
236
+ //#endregion
237
+
36
238
  const REST_API_GENERATOR_WIDGET_NAME = 'rest-api-generator-editor';
37
239
  const REST_API_GENERATOR_IMPORT_DEBOUNCE_MS = 500;
38
240
 
@@ -54,16 +256,16 @@ const AXMRestApiGeneratorWidget = {
54
256
  properties: [AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_READONLY_PROPERTY, AXP_DISABLED_PROPERTY],
55
257
  components: {
56
258
  edit: {
57
- component: () => import('./acorex-platform-module-platform-management-client-rest-api-generator-widget-edit.component-A0v5MWRU.mjs').then((c) => c.AXMRestApiGeneratorWidgetEditComponent),
259
+ component: () => import('./acorex-platform-module-platform-management-client-rest-api-generator-widget-edit.component-CXI6fJi3.mjs').then((c) => c.AXMRestApiGeneratorWidgetEditComponent),
58
260
  },
59
261
  designer: {
60
- component: () => import('./acorex-platform-module-platform-management-client-rest-api-generator-widget-edit.component-A0v5MWRU.mjs').then((c) => c.AXMRestApiGeneratorWidgetEditComponent),
262
+ component: () => import('./acorex-platform-module-platform-management-client-rest-api-generator-widget-edit.component-CXI6fJi3.mjs').then((c) => c.AXMRestApiGeneratorWidgetEditComponent),
61
263
  },
62
264
  view: {
63
- component: () => import('./acorex-platform-module-platform-management-client-rest-api-generator-widget-view.component-RR5zcsnI.mjs').then((c) => c.AXMRestApiGeneratorWidgetViewComponent),
265
+ component: () => import('./acorex-platform-module-platform-management-client-rest-api-generator-widget-view.component-C3iHgoC2.mjs').then((c) => c.AXMRestApiGeneratorWidgetViewComponent),
64
266
  },
65
267
  column: {
66
- component: () => import('./acorex-platform-module-platform-management-client-rest-api-generator-widget-column.component-B0g6dweQ.mjs').then((c) => c.AXMRestApiGeneratorWidgetColumnComponent),
268
+ component: () => import('./acorex-platform-module-platform-management-client-rest-api-generator-widget-column.component-DRkE2a7n.mjs').then((c) => c.AXMRestApiGeneratorWidgetColumnComponent),
67
269
  },
68
270
  },
69
271
  };
@@ -958,7 +1160,7 @@ function newTempId() {
958
1160
 
959
1161
  //#endregion
960
1162
  //#region ----- Platform Management Widgets Provider -----
961
- const WIDGETS = [AXMRestApiGeneratorWidget];
1163
+ const WIDGETS = [AXMRestApiGeneratorWidget, AXMQueryContractWidget];
962
1164
  class AXMPlatformManagementWidgetsProvider {
963
1165
  getWidgets() {
964
1166
  return WIDGETS;
@@ -2030,29 +2232,73 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
2030
2232
  }]
2031
2233
  }], ctorParameters: () => [{ type: AXPUpdaterService }] });
2032
2234
 
2033
- //#region ---- Imports ----
2235
+ //#region ----- Imports -----
2236
+ //#endregion
2237
+ //#region ----- Constants -----
2238
+ const MODULE_DEFINITION_ENTITY = `${RootConfig.module.name}.${RootConfig.entities.moduleDefinition.name}`;
2239
+ //#endregion
2240
+ //#region ----- Mapping -----
2241
+ function toModuleManifest(row) {
2242
+ if (!row?.name || !row?.version) {
2243
+ return null;
2244
+ }
2245
+ return {
2246
+ name: row.name,
2247
+ version: row.version,
2248
+ title: row.title || row.name,
2249
+ description: row.description,
2250
+ icon: row.icon,
2251
+ i18n: row.i18n,
2252
+ dependencies: row.dependencies,
2253
+ required: row.required,
2254
+ type: row.type,
2255
+ domain: row.domain,
2256
+ };
2257
+ }
2034
2258
  //#endregion
2035
- //#region ---- Manifest Definition ----
2259
+ //#region ----- Discovery -----
2036
2260
  /**
2037
- * Platform Management Module Manifest.
2038
- * Defines module metadata, features, and provider references.
2261
+ * Loads every `PlatformManagement.ModuleDefinition` row and maps it to a manifest.
2262
+ * One catalog query → one manifest per row (same shape as workflow task-board discovery).
2039
2263
  */
2040
- const PlatformManagementManifest = {
2041
- name: RootConfig.module.name,
2042
- version: '1.0.0',
2043
- title: RootConfig.module.title,
2044
- icon: RootConfig.module.icon,
2045
- i18n: RootConfig.config.i18n,
2046
- type: 'platform',
2047
- domain: 'platform',
2048
- dependencies: [
2049
- 'SecurityManagement',
2050
- 'ApplicationManagement',
2051
- 'SystemInsight',
2052
- 'TenantManagement',
2053
- 'SubscriptionManagement',
2054
- ],
2055
- };
2264
+ async function discoverModuleManifests(queryService) {
2265
+ try {
2266
+ const page = runtimeQueryCollectionData(await queryService.fetch(ENTITY_QUERY_DEFAULT, {
2267
+ entity: MODULE_DEFINITION_ENTITY,
2268
+ resultMode: 'all',
2269
+ }));
2270
+ const items = page?.items ?? [];
2271
+ const manifests = [];
2272
+ for (const row of items) {
2273
+ const manifest = toModuleManifest(row);
2274
+ if (manifest) {
2275
+ manifests.push(manifest);
2276
+ }
2277
+ }
2278
+ return manifests;
2279
+ }
2280
+ catch (error) {
2281
+ console.error('Failed to load module manifests from ModuleDefinition catalog:', error);
2282
+ return [];
2283
+ }
2284
+ }
2285
+ //#endregion
2286
+ //#region ----- Provider -----
2287
+ /**
2288
+ * One `AXP_MODULE_MANIFEST_PROVIDER` slot that resolves to N manifests from the API.
2289
+ */
2290
+ function provideModuleManifestsFromApi() {
2291
+ return {
2292
+ provide: AXP_MODULE_MANIFEST_PROVIDER,
2293
+ multi: true,
2294
+ useFactory: () => {
2295
+ const queryService = inject(AXPQueryService);
2296
+ // Return a loader, not the promise. The first startup call is unauthenticated and
2297
+ // would otherwise stay cached, so the post-login feature load never sees modules.
2298
+ return () => discoverModuleManifests(queryService);
2299
+ },
2300
+ };
2301
+ }
2056
2302
  //#endregion
2057
2303
 
2058
2304
  class AXMMenuProvider {
@@ -2094,6 +2340,14 @@ class AXMMenuProvider {
2094
2340
  ]);
2095
2341
  }
2096
2342
  context.find(AXPCommonMenuKeys.PlatformDefinitions).addItems([
2343
+ {
2344
+ name: AXPPlatformManagementMenuKeys.ModuleDefinitions,
2345
+ text: `@${scope}:menus.module-definitions.title`,
2346
+ path: this.entityService.createPath(moduleName, RootConfig.entities.moduleDefinition.name),
2347
+ icon: RootConfig.entities.moduleDefinition.icon,
2348
+ priority: 0,
2349
+ policy: platformShellPolicy,
2350
+ },
2097
2351
  {
2098
2352
  name: AXPPlatformManagementMenuKeys.EntityDefinitions,
2099
2353
  text: `@${scope}:menus.entity-definitions.title`,
@@ -2437,6 +2691,7 @@ function providePlatformCommandCatalogCrudService() {
2437
2691
  //#endregion
2438
2692
  //#region ----- Constants -----
2439
2693
  const CATALOG_FACTORY_BY_NAME = {
2694
+ [RootConfig.entities.moduleDefinition.name]: moduleDefinitionEntityFactory,
2440
2695
  [RootConfig.entities.entityDefinition.name]: entityDefinitionEntityFactory,
2441
2696
  [RootConfig.entities.commandDefinition.name]: commandDefinitionEntityFactory,
2442
2697
  [RootConfig.entities.queryDefinition.name]: queryDefinitionEntityFactory,
@@ -2490,6 +2745,11 @@ function applyCatalogFactoryLayout(ctx, factory) {
2490
2745
  if (factory.formats) {
2491
2746
  ctx.formats.update(() => factory.formats);
2492
2747
  }
2748
+ if (factory.relatedEntities?.length) {
2749
+ ctx.relatedEntities.remove(() => true);
2750
+ ctx.relatedEntities.add(...factory.relatedEntities);
2751
+ }
2752
+ ctx.entity.pages = factory.pages ? [...factory.pages] : [];
2493
2753
  const factoryMaster = factory.interfaces?.master;
2494
2754
  ctx.interfaces.master.update((current) => {
2495
2755
  const listActions = [...(factoryMaster?.list?.actions ?? current?.list?.actions ?? [])];
@@ -2504,6 +2764,7 @@ function applyCatalogFactoryLayout(ctx, factory) {
2504
2764
  views: factoryMaster?.list?.views ?? current?.list?.views ?? [],
2505
2765
  actions: listActions,
2506
2766
  },
2767
+ create: factoryMaster?.create ?? current?.create,
2507
2768
  single: {
2508
2769
  title: factoryMaster?.single?.title ?? '{{ name }}',
2509
2770
  description: factoryMaster?.single?.description,
@@ -2553,7 +2814,7 @@ function routesFactory() {
2553
2814
  children: [
2554
2815
  {
2555
2816
  path: '',
2556
- loadComponent: () => import('./acorex-platform-module-platform-management-client-menu-list.component-uF5w1c7t.mjs').then((c) => c.AXMMenuListComponent),
2817
+ loadComponent: () => import('./acorex-platform-module-platform-management-client-menu-list.component-iMEnFPEY.mjs').then((c) => c.AXMMenuListComponent),
2557
2818
  data: { reuse: true },
2558
2819
  },
2559
2820
  ],
@@ -2579,12 +2840,7 @@ class AXMPlatformManagementModule {
2579
2840
  multi: true,
2580
2841
  useFactory: routesFactory,
2581
2842
  },
2582
- // Module Manifest Provider
2583
- {
2584
- provide: AXP_MODULE_MANIFEST_PROVIDER,
2585
- useValue: PlatformManagementManifest,
2586
- multi: true,
2587
- },
2843
+ provideModuleManifestsFromApi(),
2588
2844
  // Provider references (now using tokens)
2589
2845
  {
2590
2846
  provide: AXP_PERMISSION_DEFINITION_PROVIDER,
@@ -2611,6 +2867,7 @@ class AXMPlatformManagementModule {
2611
2867
  useValue: AXMPlatformDefinitionCatalogEntityModifier,
2612
2868
  multi: true,
2613
2869
  },
2870
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-platform-management-client-entity-definition-form-page.provider-hLzgoJu3.mjs').then((m) => m.AXMEntityDefinitionFormPageComponentProvider)),
2614
2871
  providePlatformCommandCatalogCrudService(),
2615
2872
  provideCommandSetups([
2616
2873
  {
@@ -2619,13 +2876,17 @@ class AXMPlatformManagementModule {
2619
2876
  },
2620
2877
  {
2621
2878
  key: 'PlatformManagement:CreateUserQuery',
2622
- command: () => import('./acorex-platform-module-platform-management-client-create-user-query.command-9Ku7C1BC.mjs').then((c) => c.AXMCreateUserQueryCommand),
2879
+ command: () => import('./acorex-platform-module-platform-management-client-create-user-query.command-Bh49QHkl.mjs').then((c) => c.AXMCreateUserQueryCommand),
2880
+ },
2881
+ {
2882
+ key: 'PlatformManagement.QueryDefinition:Execute',
2883
+ command: () => import('./acorex-platform-module-platform-management-client-run-user-query.command-BzNa3B48.mjs').then((c) => c.AXMRunUserQueryCommand),
2623
2884
  },
2624
2885
  ]),
2625
2886
  provideQuerySetups([
2626
2887
  {
2627
2888
  key: 'PlatformManagement:ListRegisteredEntities',
2628
- loader: () => import('./acorex-platform-module-platform-management-client-list-registered-entities.query-DjStd3a8.mjs').then((c) => c.AXMListRegisteredEntitiesQuery),
2889
+ loader: () => import('./acorex-platform-module-platform-management-client-list-registered-entities.query-CZM6JQou.mjs').then((c) => c.AXMListRegisteredEntitiesQuery),
2629
2890
  },
2630
2891
  {
2631
2892
  key: 'PlatformManagement:ListRegisteredQueries',
@@ -2705,12 +2966,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
2705
2966
  multi: true,
2706
2967
  useFactory: routesFactory,
2707
2968
  },
2708
- // Module Manifest Provider
2709
- {
2710
- provide: AXP_MODULE_MANIFEST_PROVIDER,
2711
- useValue: PlatformManagementManifest,
2712
- multi: true,
2713
- },
2969
+ provideModuleManifestsFromApi(),
2714
2970
  // Provider references (now using tokens)
2715
2971
  {
2716
2972
  provide: AXP_PERMISSION_DEFINITION_PROVIDER,
@@ -2737,6 +2993,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
2737
2993
  useValue: AXMPlatformDefinitionCatalogEntityModifier,
2738
2994
  multi: true,
2739
2995
  },
2996
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-platform-management-client-entity-definition-form-page.provider-hLzgoJu3.mjs').then((m) => m.AXMEntityDefinitionFormPageComponentProvider)),
2740
2997
  providePlatformCommandCatalogCrudService(),
2741
2998
  provideCommandSetups([
2742
2999
  {
@@ -2745,13 +3002,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
2745
3002
  },
2746
3003
  {
2747
3004
  key: 'PlatformManagement:CreateUserQuery',
2748
- command: () => import('./acorex-platform-module-platform-management-client-create-user-query.command-9Ku7C1BC.mjs').then((c) => c.AXMCreateUserQueryCommand),
3005
+ command: () => import('./acorex-platform-module-platform-management-client-create-user-query.command-Bh49QHkl.mjs').then((c) => c.AXMCreateUserQueryCommand),
3006
+ },
3007
+ {
3008
+ key: 'PlatformManagement.QueryDefinition:Execute',
3009
+ command: () => import('./acorex-platform-module-platform-management-client-run-user-query.command-BzNa3B48.mjs').then((c) => c.AXMRunUserQueryCommand),
2749
3010
  },
2750
3011
  ]),
2751
3012
  provideQuerySetups([
2752
3013
  {
2753
3014
  key: 'PlatformManagement:ListRegisteredEntities',
2754
- loader: () => import('./acorex-platform-module-platform-management-client-list-registered-entities.query-DjStd3a8.mjs').then((c) => c.AXMListRegisteredEntitiesQuery),
3015
+ loader: () => import('./acorex-platform-module-platform-management-client-list-registered-entities.query-CZM6JQou.mjs').then((c) => c.AXMListRegisteredEntitiesQuery),
2755
3016
  },
2756
3017
  {
2757
3018
  key: 'PlatformManagement:ListRegisteredQueries',
@@ -3256,23 +3517,69 @@ function waypointsToRoundedPath(points, radius) {
3256
3517
  return cmds.join(' ');
3257
3518
  }
3258
3519
  /**
3259
- * Builds the SVG `d` string for a connector. When `options.obstacles` is supplied,
3260
- * orthogonal/rounded routes detour around the obstacle rectangles instead of
3261
- * passing through them. The `straight` style always draws a direct line.
3520
+ * Waypoints used to stroke a connector. The `straight` style is two points;
3521
+ * orthogonal/rounded styles include stub-outs and obstacle detours.
3262
3522
  */
3263
- function connectorPath(from, to, style, sourceSide, options = {}) {
3523
+ function connectorRoutePoints(from, to, style, sourceSide, options = {}) {
3264
3524
  if (style === 'straight') {
3265
- return `M ${from.x} ${from.y} L ${to.x} ${to.y}`;
3525
+ return [from, to];
3266
3526
  }
3267
3527
  const targetSide = options.targetSide ?? oppositeSide(sourceSide);
3268
- const waypoints = routeOrthogonalConnector(from, sourceSide, to, targetSide, options.obstacles ?? [], {
3528
+ return routeOrthogonalConnector(from, sourceSide, to, targetSide, options.obstacles ?? [], {
3269
3529
  stub: options.stub,
3270
3530
  obstaclePadding: options.obstaclePadding,
3271
3531
  });
3272
- if (style === 'orthogonal') {
3273
- return waypointsToOrthogonalPath(waypoints);
3532
+ }
3533
+ /**
3534
+ * Builds the SVG `d` string for a connector. When `options.obstacles` is supplied,
3535
+ * orthogonal/rounded routes detour around the obstacle rectangles instead of
3536
+ * passing through them. The `straight` style always draws a direct line.
3537
+ */
3538
+ function connectorPath(from, to, style, sourceSide, options = {}) {
3539
+ const points = connectorRoutePoints(from, to, style, sourceSide, options);
3540
+ if (style === 'rounded') {
3541
+ return waypointsToRoundedPath(points, options.cornerRadius ?? 14);
3542
+ }
3543
+ return waypointsToOrthogonalPath(points);
3544
+ }
3545
+ function longestConnectorSegment(points) {
3546
+ if (points.length < 2) {
3547
+ return null;
3548
+ }
3549
+ let from = points[0];
3550
+ let to = points[1];
3551
+ let bestLen = -1;
3552
+ for (let i = 0; i < points.length - 1; i++) {
3553
+ const a = points[i];
3554
+ const b = points[i + 1];
3555
+ const len = Math.hypot(b.x - a.x, b.y - a.y);
3556
+ if (len > bestLen) {
3557
+ bestLen = len;
3558
+ from = a;
3559
+ to = b;
3560
+ }
3274
3561
  }
3275
- return waypointsToRoundedPath(waypoints, options.cornerRadius ?? 14);
3562
+ return {
3563
+ from,
3564
+ to,
3565
+ mid: { x: (from.x + to.x) * 0.5, y: (from.y + to.y) * 0.5 },
3566
+ };
3567
+ }
3568
+ /** Offsets a point off the segment so a label sits beside the stroke, not on it. */
3569
+ function offsetPointOffSegment(point, from, to, distance) {
3570
+ const dx = to.x - from.x;
3571
+ const dy = to.y - from.y;
3572
+ const len = Math.hypot(dx, dy);
3573
+ if (len < 0.001) {
3574
+ return { x: point.x, y: point.y - distance };
3575
+ }
3576
+ let nx = -dy / len;
3577
+ let ny = dx / len;
3578
+ if (ny > 0) {
3579
+ nx = -nx;
3580
+ ny = -ny;
3581
+ }
3582
+ return { x: point.x + nx * distance, y: point.y + ny * distance };
3276
3583
  }
3277
3584
  //#endregion
3278
3585
  //#region ---- Model helpers ----
@@ -3655,6 +3962,9 @@ class AXPWorkflowDesignerComponent {
3655
3962
  ...(ngDevMode ? [{ debugName: "snapToGrid" }] : /* istanbul ignore next */ []));
3656
3963
  this.connectionPreviewStyle = input('orthogonal', /* @ts-ignore */
3657
3964
  ...(ngDevMode ? [{ debugName: "connectionPreviewStyle" }] : /* istanbul ignore next */ []));
3965
+ /** Distance (px) the connector extends straight out of a port before turning. */
3966
+ this.connectorStub = input(undefined, /* @ts-ignore */
3967
+ ...(ngDevMode ? [{ debugName: "connectorStub" }] : /* istanbul ignore next */ []));
3658
3968
  this.backgroundPattern = input('dots', /* @ts-ignore */
3659
3969
  ...(ngDevMode ? [{ debugName: "backgroundPattern" }] : /* istanbul ignore next */ []));
3660
3970
  this.zoomChange = output();
@@ -3667,6 +3977,22 @@ class AXPWorkflowDesignerComponent {
3667
3977
  /** When false, port labels are hidden (ports remain interactive). */
3668
3978
  this.showPortLabels = input(true, /* @ts-ignore */
3669
3979
  ...(ngDevMode ? [{ debugName: "showPortLabels" }] : /* istanbul ignore next */ []));
3980
+ /** When false, inbound/outbound port markers are hidden (routing still uses port anchors). */
3981
+ this.showPorts = input(true, /* @ts-ignore */
3982
+ ...(ngDevMode ? [{ debugName: "showPorts" }] : /* istanbul ignore next */ []));
3983
+ /** When false, connector `label` text is hidden. */
3984
+ this.showConnectorLabels = input(true, /* @ts-ignore */
3985
+ ...(ngDevMode ? [{ debugName: "showConnectorLabels" }] : /* istanbul ignore next */ []));
3986
+ /** Free space (px) kept around the content so nodes can be dragged outward. */
3987
+ this.canvasPadding = input(320, /* @ts-ignore */
3988
+ ...(ngDevMode ? [{ debugName: "canvasPadding" }] : /* istanbul ignore next */ []));
3989
+ /**
3990
+ * Smallest canvas the surface reserves. Editors keep a large drawing area;
3991
+ * readonly diagrams can pass `{ width: 0, height: 0 }` so `fitContent` does not
3992
+ * shrink a small graph to fit an oversized empty canvas.
3993
+ */
3994
+ this.minCanvasSize = input({ width: 1600, height: 1000 }, /* @ts-ignore */
3995
+ ...(ngDevMode ? [{ debugName: "minCanvasSize" }] : /* istanbul ignore next */ []));
3670
3996
  this.nodeBodyTemplate = input(null, /* @ts-ignore */
3671
3997
  ...(ngDevMode ? [{ debugName: "nodeBodyTemplate" }] : /* istanbul ignore next */ []));
3672
3998
  this.designerPointerDown = output();
@@ -3741,9 +4067,8 @@ class AXPWorkflowDesignerComponent {
3741
4067
  ...(ngDevMode ? [{ debugName: "gridStyle" }] : /* istanbul ignore next */ []));
3742
4068
  this.canvasViewport = computed(() => {
3743
4069
  const model = this.model();
3744
- const contentPadding = 320;
3745
- const minCanvasWidth = 1600;
3746
- const minCanvasHeight = 1000;
4070
+ const contentPadding = this.canvasPadding();
4071
+ const { width: minCanvasWidth, height: minCanvasHeight } = this.minCanvasSize();
3747
4072
  const nodeMinX = model.nodes.reduce((acc, node) => Math.min(acc, node.position.x), 0);
3748
4073
  const nodeMinY = model.nodes.reduce((acc, node) => Math.min(acc, node.position.y), 0);
3749
4074
  const nodeMaxRight = model.nodes.reduce((acc, node) => Math.max(acc, node.position.x + node.size.width), 0);
@@ -4470,22 +4795,37 @@ class AXPWorkflowDesignerComponent {
4470
4795
  //#endregion
4471
4796
  //#region ---- Connectors UI ----
4472
4797
  connectorPathD(c) {
4473
- const model = this.model();
4474
- const sn = findNode(model, c.sourceNodeId);
4475
- const tn = findNode(model, c.targetNodeId);
4476
- if (!sn || !tn)
4798
+ const ends = this.connectorEnds(c);
4799
+ if (!ends)
4477
4800
  return '';
4478
- const sp = findPort(sn, c.sourcePortId)?.port;
4479
- const tp = findPort(tn, c.targetPortId)?.port;
4480
- if (!sp || !tp)
4481
- return '';
4482
- const from = this.modelPointToSurface(portCanvasPosition(sn, sp));
4483
- const to = this.trimmedConnectorTarget(from, this.modelPointToSurface(portCanvasPosition(tn, tp)));
4484
- return connectorPath(from, to, this.connectionPreviewStyle(), sp.side, {
4485
- targetSide: tp.side,
4486
- obstacles: this.collectObstaclesInSurface(),
4801
+ return connectorPath(ends.from, ends.to, this.connectionPreviewStyle(), ends.sourceSide, {
4802
+ ...this.connectorRouteOptions(),
4803
+ targetSide: ends.targetSide,
4487
4804
  });
4488
4805
  }
4806
+ connectorLabelText(c) {
4807
+ const fromField = c.label?.trim();
4808
+ if (fromField) {
4809
+ return fromField;
4810
+ }
4811
+ const fromData = c.data?.['label'];
4812
+ return typeof fromData === 'string' ? fromData.trim() : '';
4813
+ }
4814
+ connectorLabelPoint(c) {
4815
+ const ends = this.connectorEnds(c);
4816
+ if (!ends) {
4817
+ return null;
4818
+ }
4819
+ const points = connectorRoutePoints(ends.from, ends.to, this.connectionPreviewStyle(), ends.sourceSide, {
4820
+ ...this.connectorRouteOptions(),
4821
+ targetSide: ends.targetSide,
4822
+ });
4823
+ const segment = longestConnectorSegment(points);
4824
+ if (!segment) {
4825
+ return null;
4826
+ }
4827
+ return offsetPointOffSegment(segment.mid, segment.from, segment.to, 12);
4828
+ }
4489
4829
  connectorMidpoint(c) {
4490
4830
  const model = this.model();
4491
4831
  const sn = findNode(model, c.sourceNodeId);
@@ -4548,8 +4888,8 @@ class AXPWorkflowDesignerComponent {
4548
4888
  const hoverNode = hover ? findNode(model, hover.nodeId) : undefined;
4549
4889
  const hoverPort = hover && hoverNode ? findPort(hoverNode, hover.portId)?.port : undefined;
4550
4890
  return connectorPath(from, this.trimmedConnectorTarget(from, to), this.connectionPreviewStyle(), sp.side, {
4891
+ ...this.connectorRouteOptions(),
4551
4892
  targetSide: hoverPort?.side,
4552
- obstacles: this.collectObstaclesInSurface(),
4553
4893
  });
4554
4894
  }
4555
4895
  //#endregion
@@ -4577,13 +4917,14 @@ class AXPWorkflowDesignerComponent {
4577
4917
  portLabelY(node, port) {
4578
4918
  return this.portLabelCanvasPoint(node, port).y;
4579
4919
  }
4580
- portLabelAnchor(node, port) {
4581
- const centerX = this.modelPointToSurface({ x: node.position.x + node.size.width * 0.5, y: node.position.y }).x;
4582
- const anchor = this.modelPointToSurface(portCanvasPosition(node, port));
4583
- const dx = anchor.x - centerX;
4584
- if (Math.abs(dx) < 6)
4585
- return 'middle';
4586
- return dx < 0 ? 'end' : 'start';
4920
+ portLabelAnchor(port) {
4921
+ if (port.side === 'left') {
4922
+ return 'end';
4923
+ }
4924
+ if (port.side === 'right') {
4925
+ return 'start';
4926
+ }
4927
+ return 'middle';
4587
4928
  }
4588
4929
  nodeSurfaceLeft(node) {
4589
4930
  return node.position.x + this.canvasViewport().offsetX;
@@ -4597,29 +4938,45 @@ class AXPWorkflowDesignerComponent {
4597
4938
  const len = Math.hypot(dx, dy);
4598
4939
  if (len < 0.001)
4599
4940
  return to;
4600
- // Keep arrowhead just outside the 14px port without creating a visible gap.
4601
- const trim = 7;
4941
+ // Keep the arrowhead off the port marker; sit on the node edge when ports are hidden.
4942
+ const trim = this.showPorts() ? 7 : 2;
4602
4943
  return {
4603
4944
  x: to.x - (dx / len) * trim,
4604
4945
  y: to.y - (dy / len) * trim,
4605
4946
  };
4606
4947
  }
4948
+ connectorEnds(c) {
4949
+ const model = this.model();
4950
+ const sn = findNode(model, c.sourceNodeId);
4951
+ const tn = findNode(model, c.targetNodeId);
4952
+ if (!sn || !tn) {
4953
+ return null;
4954
+ }
4955
+ const sp = findPort(sn, c.sourcePortId)?.port;
4956
+ const tp = findPort(tn, c.targetPortId)?.port;
4957
+ if (!sp || !tp) {
4958
+ return null;
4959
+ }
4960
+ const from = this.modelPointToSurface(portCanvasPosition(sn, sp));
4961
+ const to = this.trimmedConnectorTarget(from, this.modelPointToSurface(portCanvasPosition(tn, tp)));
4962
+ return { from, to, sourceSide: sp.side, targetSide: tp.side };
4963
+ }
4607
4964
  portLabelCanvasPoint(node, port) {
4608
4965
  const anchor = this.modelPointToSurface(portCanvasPosition(node, port));
4609
- const center = {
4610
- x: node.position.x + node.size.width * 0.5 + this.canvasViewport().offsetX,
4611
- y: node.position.y + node.size.height * 0.5 + this.canvasViewport().offsetY,
4612
- };
4613
- const vx = anchor.x - center.x;
4614
- const vy = anchor.y - center.y;
4615
- const len = Math.hypot(vx, vy);
4616
- if (len < 0.001)
4617
- return anchor;
4618
- const outward = 18;
4619
- return {
4620
- x: anchor.x + (vx / len) * outward,
4621
- y: anchor.y + (vy / len) * outward,
4622
- };
4966
+ const outward = this.showPorts() ? 22 : 12;
4967
+ const lift = 12;
4968
+ switch (port.side) {
4969
+ case 'left':
4970
+ return { x: anchor.x - outward, y: anchor.y - lift };
4971
+ case 'right':
4972
+ return { x: anchor.x + outward, y: anchor.y - lift };
4973
+ case 'top':
4974
+ return { x: anchor.x, y: anchor.y - outward };
4975
+ case 'bottom':
4976
+ return { x: anchor.x, y: anchor.y + outward };
4977
+ default:
4978
+ return anchor;
4979
+ }
4623
4980
  }
4624
4981
  //#endregion
4625
4982
  //#region ---- Canvas mapping ----
@@ -4655,6 +5012,13 @@ class AXPWorkflowDesignerComponent {
4655
5012
  }
4656
5013
  return obstacles;
4657
5014
  }
5015
+ connectorRouteOptions() {
5016
+ const stub = this.connectorStub();
5017
+ return {
5018
+ obstacles: this.collectObstaclesInSurface(),
5019
+ ...(stub != null && stub >= 0 ? { stub } : {}),
5020
+ };
5021
+ }
4658
5022
  //#endregion
4659
5023
  //#region ---- Wrapper visuals ----
4660
5024
  syncWrapperBackgroundStyle() {
@@ -4684,15 +5048,15 @@ class AXPWorkflowDesignerComponent {
4684
5048
  window.removeEventListener('pointercancel', this.onWindowPointerUpForLink);
4685
5049
  }
4686
5050
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWorkflowDesignerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4687
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPWorkflowDesignerComponent, isStandalone: true, selector: "axp-workflow-designer", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, highlightedNodeIds: { classPropertyName: "highlightedNodeIds", publicName: "highlightedNodeIds", isSignal: true, isRequired: false, transformFunction: null }, gridSize: { classPropertyName: "gridSize", publicName: "gridSize", isSignal: true, isRequired: false, transformFunction: null }, snapToGrid: { classPropertyName: "snapToGrid", publicName: "snapToGrid", isSignal: true, isRequired: false, transformFunction: null }, connectionPreviewStyle: { classPropertyName: "connectionPreviewStyle", publicName: "connectionPreviewStyle", isSignal: true, isRequired: false, transformFunction: null }, backgroundPattern: { classPropertyName: "backgroundPattern", publicName: "backgroundPattern", isSignal: true, isRequired: false, transformFunction: null }, canConnect: { classPropertyName: "canConnect", publicName: "canConnect", isSignal: true, isRequired: false, transformFunction: null }, paletteItems: { classPropertyName: "paletteItems", publicName: "paletteItems", isSignal: true, isRequired: false, transformFunction: null }, showPortLabels: { classPropertyName: "showPortLabels", publicName: "showPortLabels", isSignal: true, isRequired: false, transformFunction: null }, nodeBodyTemplate: { classPropertyName: "nodeBodyTemplate", publicName: "nodeBodyTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { modelChange: "modelChange", zoomChange: "zoomChange", designerPointerDown: "designerPointerDown", designerClick: "designerClick", designerDoubleClick: "designerDoubleClick", nodePointerDown: "nodePointerDown", nodeClick: "nodeClick", nodeDoubleClick: "nodeDoubleClick", nodeContextMenu: "nodeContextMenu", nodeDragStart: "nodeDragStart", nodeDragEnd: "nodeDragEnd", portPointerDown: "portPointerDown", linkDragStart: "linkDragStart", linkDragMove: "linkDragMove", linkDragEnd: "linkDragEnd", connectorClick: "connectorClick", connectorDoubleClick: "connectorDoubleClick", connectionCreated: "connectionCreated", connectionRejected: "connectionRejected", activationChange: "activationChange" }, host: { listeners: { "window:keydown": "onWindowKeydown($event)" }, classAttribute: "axp-workflow-designer-host" }, viewQueries: [{ propertyName: "surfaceRef", first: true, predicate: ["surface"], descendants: true, isSignal: true }, { propertyName: "panViewRef", first: true, predicate: AXPanViewDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"axp-workflow-designer\" [ngStyle]=\"gridStyle()\">\n <div\n #surface\n class=\"axp-workflow-designer__surface\"\n axPanView\n [(panX)]=\"panX\"\n [(panY)]=\"panY\"\n [(zoom)]=\"panZoomLevel\"\n [maxZoom]=\"10000\"\n [freeMode]=\"true\"\n [fitContent]=\"true\"\n wrapperClasses=\"h\"\n [ngStyle]=\"surfaceStyle()\"\n (pointerdown)=\"onSurfacePointerDown($event)\"\n (click)=\"onSurfaceClick($event)\"\n (dblclick)=\"onSurfaceDoubleClick($event)\"\n (dragover)=\"onCanvasDragOver($event)\"\n (drop)=\"onCanvasDrop($event)\"\n >\n <svg\n class=\"axp-workflow-designer__svg\"\n width=\"100%\"\n height=\"100%\"\n preserveAspectRatio=\"xMinYMin meet\"\n >\n <defs>\n <marker\n [attr.id]=\"svgMarkerId\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n refX=\"3.9\"\n refY=\"3\"\n orient=\"auto\"\n >\n <path\n d=\"M0,0 L4,3 L0,6 Q1.5,3 0,0 Z\"\n class=\"axp-workflow-designer__arrow-head\"\n ></path>\n </marker>\n </defs>\n @for (c of model().connectors; track c.id) {\n <path\n class=\"axp-workflow-designer__edge-hit\"\n [attr.d]=\"connectorPathD(c)\"\n fill=\"none\"\n stroke=\"transparent\"\n stroke-width=\"16\"\n pointer-events=\"stroke\"\n (click)=\"onConnectorClick(c, $event)\"\n (dblclick)=\"onConnectorDoubleClick(c, $event)\"\n />\n <path\n [class]=\"connectorEdgeClasses(c)\"\n [attr.d]=\"connectorPathD(c)\"\n fill=\"none\"\n [attr.marker-end]=\"'url(#' + svgMarkerId + ')'\"\n />\n }\n @if (linkDrag()) {\n <path\n class=\"axp-workflow-designer__edge-preview\"\n [attr.d]=\"previewPath()\"\n fill=\"none\"\n />\n }\n @if (showPortLabels()) {\n @for (node of model().nodes; track node.id) {\n @for (port of node.inboundPorts; track port.id) {\n @if (portLabelText(port)) {\n <text\n class=\"axp-workflow-designer__port-label-svg\"\n [attr.x]=\"portLabelX(node, port)\"\n [attr.y]=\"portLabelY(node, port)\"\n [attr.text-anchor]=\"portLabelAnchor(node, port)\"\n >\n {{ portLabelText(port) }}\n </text>\n }\n }\n @for (port of node.outboundPorts; track port.id) {\n @if (portLabelText(port)) {\n <text\n class=\"axp-workflow-designer__port-label-svg\"\n [attr.x]=\"portLabelX(node, port)\"\n [attr.y]=\"portLabelY(node, port)\"\n [attr.text-anchor]=\"portLabelAnchor(node, port)\"\n >\n {{ portLabelText(port) }}\n </text>\n }\n }\n }\n }\n </svg>\n\n @for (c of model().connectors; track c.id) {\n @if (isConnectorActive(c.id) && !isConnectorReadonly(c)) {\n <div\n class=\"axp-workflow-designer__connector-actions\"\n [style.left.px]=\"connectorMidpoint(c).x - 16\"\n [style.top.px]=\"connectorMidpoint(c).y - 16\"\n >\n <ax-button\n look=\"blank\"\n class=\"ax-sm axp-workflow-designer__icon-btn\"\n (onClick)=\"removeConnector(c)\"\n >\n <ax-icon class=\"fa-solid fa-minus\"></ax-icon>\n </ax-button>\n </div>\n }\n }\n\n @for (node of model().nodes; track node.id) {\n <div\n class=\"axp-workflow-designer__node\"\n [class.axp-workflow-designer__node--active]=\"isNodeActive(node.id)\"\n [class.axp-workflow-designer__node--highlighted]=\"\n isNodeHighlighted(node.id)\n \"\n [style.left.px]=\"nodeSurfaceLeft(node)\"\n [style.top.px]=\"nodeSurfaceTop(node)\"\n [style.width.px]=\"node.size.width\"\n [style.height.px]=\"node.size.height\"\n (pointerdown)=\"onNodePointerDown(node, $event)\"\n (click)=\"onNodeClick(node, $event)\"\n (dblclick)=\"onNodeDoubleClick(node, $event)\"\n (contextmenu)=\"onNodeContextMenu(node, $event)\"\n >\n <div [class]=\"nodeShapeClasses(node)\">\n <div\n class=\"axp-workflow-designer__node-body\"\n (pointerdown)=\"onNodeBodyPointerDown(node, $event)\"\n >\n @if (nodeBodyTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"templateContext(node)\"\n />\n } @else {\n <div class=\"axp-workflow-designer__node-default\">\n @if (node.icon) {\n <ax-icon\n class=\"axp-workflow-designer__node-default-icon\"\n [class]=\"node.icon\"\n ></ax-icon>\n }\n <span class=\"axp-workflow-designer__node-default-title\">{{\n node.title\n }}</span>\n </div>\n }\n </div>\n </div>\n\n @for (port of node.inboundPorts; track port.id) {\n <div\n class=\"axp-workflow-designer__port-cluster\"\n [class.axp-workflow-designer__port-cluster--side-top]=\"\n port.side === 'top'\n \"\n [class.axp-workflow-designer__port-cluster--side-right]=\"\n port.side === 'right'\n \"\n [class.axp-workflow-designer__port-cluster--side-bottom]=\"\n port.side === 'bottom'\n \"\n [class.axp-workflow-designer__port-cluster--side-left]=\"\n port.side === 'left'\n \"\n [ngStyle]=\"portClusterStyle(node, port)\"\n >\n <button\n type=\"button\"\n class=\"axp-workflow-designer__port axp-workflow-designer__port--inbound\"\n [class.axp-workflow-designer__port--active]=\"\n isPortActive(node.id, port.id)\n \"\n [class.axp-workflow-designer__port--link-hover]=\"\n isPortLinkHoverTarget(node.id, port.id)\n \"\n [class.axp-workflow-designer__port--disabled]=\"port.disabled\"\n [disabled]=\"isNodeReadonly(node) || port.disabled === true\"\n (pointerdown)=\"onPortPointerDown(node, port, $event)\"\n ></button>\n </div>\n }\n @for (port of node.outboundPorts; track port.id) {\n <div\n class=\"axp-workflow-designer__port-cluster\"\n [class.axp-workflow-designer__port-cluster--side-top]=\"\n port.side === 'top'\n \"\n [class.axp-workflow-designer__port-cluster--side-right]=\"\n port.side === 'right'\n \"\n [class.axp-workflow-designer__port-cluster--side-bottom]=\"\n port.side === 'bottom'\n \"\n [class.axp-workflow-designer__port-cluster--side-left]=\"\n port.side === 'left'\n \"\n [ngStyle]=\"portClusterStyle(node, port)\"\n >\n <button\n type=\"button\"\n class=\"axp-workflow-designer__port axp-workflow-designer__port--outbound\"\n [class.axp-workflow-designer__port--active]=\"\n isPortActive(node.id, port.id)\n \"\n [class.axp-workflow-designer__port--disabled]=\"port.disabled\"\n [disabled]=\"isNodeReadonly(node) || port.disabled === true\"\n (pointerdown)=\"onPortPointerDown(node, port, $event)\"\n ></button>\n </div>\n }\n\n @if (isNodeActive(node.id) && !isNodeReadonly(node)) {\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--nw\"\n (pointerdown)=\"onResizePointerDown(node, 'nw', $event)\"\n ></span>\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--ne\"\n (pointerdown)=\"onResizePointerDown(node, 'ne', $event)\"\n ></span>\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--sw\"\n (pointerdown)=\"onResizePointerDown(node, 'sw', $event)\"\n ></span>\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--se\"\n (pointerdown)=\"onResizePointerDown(node, 'se', $event)\"\n ></span>\n }\n </div>\n }\n </div>\n</div>\n", styles: ["@layer properties;.axp-workflow-designer-host{box-sizing:border-box;display:block;height:100%;width:100%;min-height:360px;user-select:none;-webkit-user-select:none}.axp-workflow-designer{display:flex;height:100%;width:100%;min-height:inherit}.axp-workflow-designer .axp-workflow-designer__surface{position:relative;min-height:100%;min-width:100%;flex:auto;overflow:auto;border-radius:10px;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__surface::ng-deep .pan-view__wrapper{height:100%;width:100%}.axp-workflow-designer .axp-workflow-designer__svg{pointer-events:none;position:absolute;inset:0;height:100%;width:100%;z-index:1}.axp-workflow-designer .axp-workflow-designer__edge-hit{pointer-events:stroke;cursor:pointer}.axp-workflow-designer .axp-workflow-designer__edge{pointer-events:none;stroke:rgb(var(--ax-sys-color-neutral-500));stroke-width:2;transition:stroke .12s ease}.axp-workflow-designer .axp-workflow-designer__edge.primary-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-primary-500))}.axp-workflow-designer .axp-workflow-designer__edge.secondary-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-secondary-500))}.axp-workflow-designer .axp-workflow-designer__edge.success-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-success-500))}.axp-workflow-designer .axp-workflow-designer__edge.warning-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-warning-500))}.axp-workflow-designer .axp-workflow-designer__edge.danger-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-danger-500))}.axp-workflow-designer .axp-workflow-designer__edge--active{stroke:rgb(var(--ax-sys-color-primary-500));stroke-dasharray:2}.axp-workflow-designer .axp-workflow-designer__edge-preview{pointer-events:none;stroke:rgb(var(--ax-sys-color-primary-400));stroke-width:2;stroke-dasharray:6 4}.axp-workflow-designer .axp-workflow-designer__port-label-svg{fill:rgb(var(--ax-sys-color-on-surface));font-size:10px;font-weight:600;dominant-baseline:middle;pointer-events:none;paint-order:stroke;stroke:rgb(var(--ax-sys-color-surface));stroke-width:4px;stroke-linejoin:round}.axp-workflow-designer .axp-workflow-designer__arrow-head{fill:rgb(var(--ax-sys-color-neutral-500))}.axp-workflow-designer .axp-workflow-designer__connector-actions{position:absolute;display:flex;align-items:center;justify-content:center;z-index:4}.axp-workflow-designer .axp-workflow-designer__icon-btn{border-radius:999px;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__node{position:absolute;box-sizing:border-box;z-index:2;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__node.axp-workflow-designer__node--active .axp-workflow-designer__node-shape{border:2px dotted rgb(var(--ax-sys-color-primary-500))}.axp-workflow-designer .axp-workflow-designer__node.axp-workflow-designer__node--highlighted .axp-workflow-designer__node-shape{border:2px solid rgb(var(--ax-sys-color-primary-500));box-shadow:0 0 0 3px rgb(var(--ax-sys-color-primary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape{position:absolute;inset:0;box-sizing:border-box;overflow:visible;background:rgb(var(--ax-sys-color-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-primary-surface{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-secondary-surface{background:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-success-surface{background:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-warning-surface{background:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-danger-surface{background:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-primary-border{border:2px solid rgb(var(--ax-sys-color-border-primary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-secondary-border{border:2px solid rgb(var(--ax-sys-color-border-secondary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-success-border{border:2px solid rgb(var(--ax-sys-color-border-success-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-warning-border{border:2px solid rgb(var(--ax-sys-color-border-warning-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-danger-border{border:2px solid rgb(var(--ax-sys-color-border-danger-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape--rectangle{border-radius:4px}.axp-workflow-designer .axp-workflow-designer__node-shape--rounded-rectangle{border-radius:14px}.axp-workflow-designer .axp-workflow-designer__node-shape--circle,.axp-workflow-designer .axp-workflow-designer__node-shape--ellipse{border-radius:50%}.axp-workflow-designer .axp-workflow-designer__node-shape--diamond{border-radius:0;clip-path:polygon(50% 0%,100% 50%,50% 100%,0% 50%)}.axp-workflow-designer .axp-workflow-designer__node-body{position:absolute;inset:0;display:flex;cursor:grab;align-items:center;justify-content:center;padding:8px 12px;touch-action:none;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__node-default{display:flex;min-width:0px;align-items:center;gap:8px}.axp-workflow-designer .axp-workflow-designer__node-default-icon{flex-shrink:0}.axp-workflow-designer .axp-workflow-designer__node-default-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.axp-workflow-designer .axp-workflow-designer__port-cluster{pointer-events:none;position:absolute;overflow:visible;width:0;height:0;transform:translate(-50%,-50%);z-index:3}.axp-workflow-designer .axp-workflow-designer__port{position:absolute;flex-shrink:0;cursor:crosshair;border-radius:calc(infinity * 1px);left:50%;top:50%;transform:translate(-50%,-50%);width:14px;height:14px;padding:0;border:1px solid rgb(var(--ax-sys-color-surface));touch-action:none;pointer-events:auto;transition:transform .12s ease}.axp-workflow-designer .axp-workflow-designer__port:disabled{opacity:.45;cursor:not-allowed}.axp-workflow-designer .axp-workflow-designer__port--inbound{background:rgb(var(--ax-sys-color-success-500))}.axp-workflow-designer .axp-workflow-designer__port--outbound{background:rgb(var(--ax-sys-color-primary-500))}.axp-workflow-designer .axp-workflow-designer__port--active{box-shadow:0 0 0 3px #3b82f659}.axp-workflow-designer .axp-workflow-designer__port--link-hover{border:1px solid rgb(var(--ax-sys-color-primary-500));transform:translate(-50%,-50%) scale(1.12)}.axp-workflow-designer .axp-workflow-designer__port--disabled{opacity:.45;cursor:not-allowed}.axp-workflow-designer .axp-workflow-designer__resize{position:absolute;border-radius:calc(infinity * 1px);width:7px;height:7px;background:rgb(var(--ax-sys-color-primary-500));border:1px solid rgb(var(--ax-sys-color-surface));z-index:4;touch-action:none;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__resize--nw{left:-6px;top:-6px;cursor:nwse-resize}.axp-workflow-designer .axp-workflow-designer__resize--ne{right:-6px;top:-6px;cursor:nesw-resize}.axp-workflow-designer .axp-workflow-designer__resize--sw{left:-6px;bottom:-6px;cursor:nesw-resize}.axp-workflow-designer .axp-workflow-designer__resize--se{right:-6px;bottom:-6px;cursor:nwse-resize}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "directive", type: AXPanViewDirective, selector: "[axPanView]", inputs: ["zoomStep", "minZoom", "maxZoom", "freeMode", "fitContent", "disablePan", "disableZoom", "wrapperClasses", "panX", "panY", "zoom"], outputs: ["panXChange", "panYChange", "zoomChange", "positionChange"], exportAs: ["axPanView"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5051
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPWorkflowDesignerComponent, isStandalone: true, selector: "axp-workflow-designer", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, highlightedNodeIds: { classPropertyName: "highlightedNodeIds", publicName: "highlightedNodeIds", isSignal: true, isRequired: false, transformFunction: null }, gridSize: { classPropertyName: "gridSize", publicName: "gridSize", isSignal: true, isRequired: false, transformFunction: null }, snapToGrid: { classPropertyName: "snapToGrid", publicName: "snapToGrid", isSignal: true, isRequired: false, transformFunction: null }, connectionPreviewStyle: { classPropertyName: "connectionPreviewStyle", publicName: "connectionPreviewStyle", isSignal: true, isRequired: false, transformFunction: null }, connectorStub: { classPropertyName: "connectorStub", publicName: "connectorStub", isSignal: true, isRequired: false, transformFunction: null }, backgroundPattern: { classPropertyName: "backgroundPattern", publicName: "backgroundPattern", isSignal: true, isRequired: false, transformFunction: null }, canConnect: { classPropertyName: "canConnect", publicName: "canConnect", isSignal: true, isRequired: false, transformFunction: null }, paletteItems: { classPropertyName: "paletteItems", publicName: "paletteItems", isSignal: true, isRequired: false, transformFunction: null }, showPortLabels: { classPropertyName: "showPortLabels", publicName: "showPortLabels", isSignal: true, isRequired: false, transformFunction: null }, showPorts: { classPropertyName: "showPorts", publicName: "showPorts", isSignal: true, isRequired: false, transformFunction: null }, showConnectorLabels: { classPropertyName: "showConnectorLabels", publicName: "showConnectorLabels", isSignal: true, isRequired: false, transformFunction: null }, canvasPadding: { classPropertyName: "canvasPadding", publicName: "canvasPadding", isSignal: true, isRequired: false, transformFunction: null }, minCanvasSize: { classPropertyName: "minCanvasSize", publicName: "minCanvasSize", isSignal: true, isRequired: false, transformFunction: null }, nodeBodyTemplate: { classPropertyName: "nodeBodyTemplate", publicName: "nodeBodyTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { modelChange: "modelChange", zoomChange: "zoomChange", designerPointerDown: "designerPointerDown", designerClick: "designerClick", designerDoubleClick: "designerDoubleClick", nodePointerDown: "nodePointerDown", nodeClick: "nodeClick", nodeDoubleClick: "nodeDoubleClick", nodeContextMenu: "nodeContextMenu", nodeDragStart: "nodeDragStart", nodeDragEnd: "nodeDragEnd", portPointerDown: "portPointerDown", linkDragStart: "linkDragStart", linkDragMove: "linkDragMove", linkDragEnd: "linkDragEnd", connectorClick: "connectorClick", connectorDoubleClick: "connectorDoubleClick", connectionCreated: "connectionCreated", connectionRejected: "connectionRejected", activationChange: "activationChange" }, host: { listeners: { "window:keydown": "onWindowKeydown($event)" }, classAttribute: "axp-workflow-designer-host" }, viewQueries: [{ propertyName: "surfaceRef", first: true, predicate: ["surface"], descendants: true, isSignal: true }, { propertyName: "panViewRef", first: true, predicate: AXPanViewDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"axp-workflow-designer\" [ngStyle]=\"gridStyle()\">\n <div\n #surface\n class=\"axp-workflow-designer__surface\"\n axPanView\n [(panX)]=\"panX\"\n [(panY)]=\"panY\"\n [(zoom)]=\"panZoomLevel\"\n [maxZoom]=\"10000\"\n [freeMode]=\"true\"\n [fitContent]=\"true\"\n wrapperClasses=\"h\"\n [ngStyle]=\"surfaceStyle()\"\n (pointerdown)=\"onSurfacePointerDown($event)\"\n (click)=\"onSurfaceClick($event)\"\n (dblclick)=\"onSurfaceDoubleClick($event)\"\n (dragover)=\"onCanvasDragOver($event)\"\n (drop)=\"onCanvasDrop($event)\"\n >\n <svg\n class=\"axp-workflow-designer__svg\"\n width=\"100%\"\n height=\"100%\"\n preserveAspectRatio=\"xMinYMin meet\"\n >\n <defs>\n <marker\n [attr.id]=\"svgMarkerId\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n refX=\"3.9\"\n refY=\"3\"\n orient=\"auto\"\n >\n <path\n d=\"M0,0 L4,3 L0,6 Q1.5,3 0,0 Z\"\n class=\"axp-workflow-designer__arrow-head\"\n ></path>\n </marker>\n </defs>\n @for (c of model().connectors; track c.id) {\n <path\n class=\"axp-workflow-designer__edge-hit\"\n [attr.d]=\"connectorPathD(c)\"\n fill=\"none\"\n stroke=\"transparent\"\n stroke-width=\"16\"\n pointer-events=\"stroke\"\n (click)=\"onConnectorClick(c, $event)\"\n (dblclick)=\"onConnectorDoubleClick(c, $event)\"\n />\n <path\n [class]=\"connectorEdgeClasses(c)\"\n [attr.d]=\"connectorPathD(c)\"\n fill=\"none\"\n [attr.marker-end]=\"'url(#' + svgMarkerId + ')'\"\n />\n }\n @if (linkDrag()) {\n <path\n class=\"axp-workflow-designer__edge-preview\"\n [attr.d]=\"previewPath()\"\n fill=\"none\"\n />\n }\n </svg>\n\n @for (c of model().connectors; track c.id) {\n @if (isConnectorActive(c.id) && !isConnectorReadonly(c)) {\n <div\n class=\"axp-workflow-designer__connector-actions\"\n [style.left.px]=\"connectorMidpoint(c).x - 16\"\n [style.top.px]=\"connectorMidpoint(c).y - 16\"\n >\n <ax-button\n look=\"blank\"\n class=\"ax-sm axp-workflow-designer__icon-btn\"\n (onClick)=\"removeConnector(c)\"\n >\n <ax-icon class=\"fa-solid fa-minus\"></ax-icon>\n </ax-button>\n </div>\n }\n }\n\n @for (node of model().nodes; track node.id) {\n <div\n class=\"axp-workflow-designer__node\"\n [class.axp-workflow-designer__node--active]=\"isNodeActive(node.id)\"\n [class.axp-workflow-designer__node--highlighted]=\"\n isNodeHighlighted(node.id)\n \"\n [style.left.px]=\"nodeSurfaceLeft(node)\"\n [style.top.px]=\"nodeSurfaceTop(node)\"\n [style.width.px]=\"node.size.width\"\n [style.height.px]=\"node.size.height\"\n (pointerdown)=\"onNodePointerDown(node, $event)\"\n (click)=\"onNodeClick(node, $event)\"\n (dblclick)=\"onNodeDoubleClick(node, $event)\"\n (contextmenu)=\"onNodeContextMenu(node, $event)\"\n >\n <div [class]=\"nodeShapeClasses(node)\">\n <div\n class=\"axp-workflow-designer__node-body\"\n (pointerdown)=\"onNodeBodyPointerDown(node, $event)\"\n >\n @if (nodeBodyTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"templateContext(node)\"\n />\n } @else {\n <div class=\"axp-workflow-designer__node-default\">\n @if (node.icon) {\n <ax-icon\n class=\"axp-workflow-designer__node-default-icon\"\n [class]=\"node.icon\"\n ></ax-icon>\n }\n <span class=\"axp-workflow-designer__node-default-title\">{{\n node.title\n }}</span>\n </div>\n }\n </div>\n </div>\n\n <!--->\n <!-- ----- Optional inbound / outbound port markers ----- -->\n @if (showPorts()) {\n @for (port of node.inboundPorts; track port.id) {\n <div\n class=\"axp-workflow-designer__port-cluster\"\n [class.axp-workflow-designer__port-cluster--side-top]=\"\n port.side === 'top'\n \"\n [class.axp-workflow-designer__port-cluster--side-right]=\"\n port.side === 'right'\n \"\n [class.axp-workflow-designer__port-cluster--side-bottom]=\"\n port.side === 'bottom'\n \"\n [class.axp-workflow-designer__port-cluster--side-left]=\"\n port.side === 'left'\n \"\n [ngStyle]=\"portClusterStyle(node, port)\"\n >\n <button\n type=\"button\"\n class=\"axp-workflow-designer__port axp-workflow-designer__port--inbound\"\n [class.axp-workflow-designer__port--active]=\"\n isPortActive(node.id, port.id)\n \"\n [class.axp-workflow-designer__port--link-hover]=\"\n isPortLinkHoverTarget(node.id, port.id)\n \"\n [class.axp-workflow-designer__port--disabled]=\"port.disabled\"\n [disabled]=\"isNodeReadonly(node) || port.disabled === true\"\n (pointerdown)=\"onPortPointerDown(node, port, $event)\"\n ></button>\n </div>\n }\n @for (port of node.outboundPorts; track port.id) {\n <div\n class=\"axp-workflow-designer__port-cluster\"\n [class.axp-workflow-designer__port-cluster--side-top]=\"\n port.side === 'top'\n \"\n [class.axp-workflow-designer__port-cluster--side-right]=\"\n port.side === 'right'\n \"\n [class.axp-workflow-designer__port-cluster--side-bottom]=\"\n port.side === 'bottom'\n \"\n [class.axp-workflow-designer__port-cluster--side-left]=\"\n port.side === 'left'\n \"\n [ngStyle]=\"portClusterStyle(node, port)\"\n >\n <button\n type=\"button\"\n class=\"axp-workflow-designer__port axp-workflow-designer__port--outbound\"\n [class.axp-workflow-designer__port--active]=\"\n isPortActive(node.id, port.id)\n \"\n [class.axp-workflow-designer__port--disabled]=\"port.disabled\"\n [disabled]=\"isNodeReadonly(node) || port.disabled === true\"\n (pointerdown)=\"onPortPointerDown(node, port, $event)\"\n ></button>\n </div>\n }\n }\n\n @if (isNodeActive(node.id) && !isNodeReadonly(node)) {\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--nw\"\n (pointerdown)=\"onResizePointerDown(node, 'nw', $event)\"\n ></span>\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--ne\"\n (pointerdown)=\"onResizePointerDown(node, 'ne', $event)\"\n ></span>\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--sw\"\n (pointerdown)=\"onResizePointerDown(node, 'sw', $event)\"\n ></span>\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--se\"\n (pointerdown)=\"onResizePointerDown(node, 'se', $event)\"\n ></span>\n }\n </div>\n }\n\n <svg\n class=\"axp-workflow-designer__svg axp-workflow-designer__svg--labels\"\n width=\"100%\"\n height=\"100%\"\n preserveAspectRatio=\"xMinYMin meet\"\n >\n @if (showPortLabels()) {\n @for (node of model().nodes; track node.id) {\n @for (port of node.inboundPorts; track port.id) {\n <!--->\n <!-- ----- Cardinality / port name on the inbound side ----- -->\n @if (portLabelText(port)) {\n <text\n class=\"axp-workflow-designer__port-label-svg\"\n [attr.x]=\"portLabelX(node, port)\"\n [attr.y]=\"portLabelY(node, port)\"\n [attr.text-anchor]=\"portLabelAnchor(port)\"\n >\n {{ portLabelText(port) }}\n </text>\n }\n }\n @for (port of node.outboundPorts; track port.id) {\n <!--->\n <!-- ----- Cardinality / port name on the outbound side ----- -->\n @if (portLabelText(port)) {\n <text\n class=\"axp-workflow-designer__port-label-svg\"\n [attr.x]=\"portLabelX(node, port)\"\n [attr.y]=\"portLabelY(node, port)\"\n [attr.text-anchor]=\"portLabelAnchor(port)\"\n >\n {{ portLabelText(port) }}\n </text>\n }\n }\n }\n }\n @if (showConnectorLabels()) {\n @for (c of model().connectors; track c.id) {\n <!--->\n <!-- ----- Skip connectors without a label ----- -->\n @if (connectorLabelText(c); as text) {\n <!--->\n <!-- ----- Relation name beside the longest connector segment ----- -->\n @if (connectorLabelPoint(c); as point) {\n <text\n class=\"axp-workflow-designer__edge-label-svg\"\n [attr.x]=\"point.x\"\n [attr.y]=\"point.y\"\n text-anchor=\"middle\"\n >\n {{ text }}\n </text>\n }\n }\n }\n }\n </svg>\n </div>\n</div>\n", styles: ["@layer properties;.axp-workflow-designer-host{box-sizing:border-box;display:block;height:100%;width:100%;min-height:360px;user-select:none;-webkit-user-select:none}.axp-workflow-designer{display:flex;height:100%;width:100%;min-height:inherit}.axp-workflow-designer .axp-workflow-designer__surface{position:relative;min-height:100%;min-width:100%;flex:auto;overflow:auto;border-radius:10px;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__surface::ng-deep .pan-view__wrapper{height:100%;width:100%}.axp-workflow-designer .axp-workflow-designer__svg{pointer-events:none;position:absolute;inset:0;height:100%;width:100%;z-index:1}.axp-workflow-designer .axp-workflow-designer__svg--labels{z-index:4}.axp-workflow-designer .axp-workflow-designer__edge-hit{pointer-events:stroke;cursor:pointer}.axp-workflow-designer .axp-workflow-designer__edge{pointer-events:none;stroke:rgb(var(--ax-sys-color-neutral-500));stroke-width:2;transition:stroke .12s ease}.axp-workflow-designer .axp-workflow-designer__edge.primary-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-primary-500))}.axp-workflow-designer .axp-workflow-designer__edge.secondary-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-secondary-500))}.axp-workflow-designer .axp-workflow-designer__edge.success-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-success-500))}.axp-workflow-designer .axp-workflow-designer__edge.warning-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-warning-500))}.axp-workflow-designer .axp-workflow-designer__edge.danger-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-danger-500))}.axp-workflow-designer .axp-workflow-designer__edge--active{stroke:rgb(var(--ax-sys-color-primary-500));stroke-dasharray:2}.axp-workflow-designer .axp-workflow-designer__edge-preview{pointer-events:none;stroke:rgb(var(--ax-sys-color-primary-400));stroke-width:2;stroke-dasharray:6 4}.axp-workflow-designer .axp-workflow-designer__port-label-svg,.axp-workflow-designer .axp-workflow-designer__edge-label-svg{fill:rgb(var(--ax-sys-color-on-surface));font-size:10px;font-weight:600;dominant-baseline:middle;pointer-events:none;paint-order:stroke;stroke:rgb(var(--ax-sys-color-surface));stroke-width:4px;stroke-linejoin:round}.axp-workflow-designer .axp-workflow-designer__arrow-head{fill:rgb(var(--ax-sys-color-neutral-500))}.axp-workflow-designer .axp-workflow-designer__connector-actions{position:absolute;display:flex;align-items:center;justify-content:center;z-index:4}.axp-workflow-designer .axp-workflow-designer__icon-btn{border-radius:999px;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__node{position:absolute;box-sizing:border-box;z-index:2;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__node.axp-workflow-designer__node--active .axp-workflow-designer__node-shape{border:2px dotted rgb(var(--ax-sys-color-primary-500))}.axp-workflow-designer .axp-workflow-designer__node.axp-workflow-designer__node--highlighted .axp-workflow-designer__node-shape{border:2px solid rgb(var(--ax-sys-color-primary-500));box-shadow:0 0 0 3px rgb(var(--ax-sys-color-primary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape{position:absolute;inset:0;box-sizing:border-box;overflow:visible;background:rgb(var(--ax-sys-color-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-primary-surface{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-secondary-surface{background:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-success-surface{background:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-warning-surface{background:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-danger-surface{background:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-primary-border{border:2px solid rgb(var(--ax-sys-color-border-primary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-secondary-border{border:2px solid rgb(var(--ax-sys-color-border-secondary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-success-border{border:2px solid rgb(var(--ax-sys-color-border-success-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-warning-border{border:2px solid rgb(var(--ax-sys-color-border-warning-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-danger-border{border:2px solid rgb(var(--ax-sys-color-border-danger-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape--rectangle{border-radius:4px}.axp-workflow-designer .axp-workflow-designer__node-shape--rounded-rectangle{border-radius:14px}.axp-workflow-designer .axp-workflow-designer__node-shape--circle,.axp-workflow-designer .axp-workflow-designer__node-shape--ellipse{border-radius:50%}.axp-workflow-designer .axp-workflow-designer__node-shape--diamond{border-radius:0;clip-path:polygon(50% 0%,100% 50%,50% 100%,0% 50%)}.axp-workflow-designer .axp-workflow-designer__node-body{position:absolute;inset:0;display:flex;cursor:grab;align-items:center;justify-content:center;padding:8px 12px;touch-action:none;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__node-default{display:flex;min-width:0px;align-items:center;gap:8px}.axp-workflow-designer .axp-workflow-designer__node-default-icon{flex-shrink:0}.axp-workflow-designer .axp-workflow-designer__node-default-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.axp-workflow-designer .axp-workflow-designer__port-cluster{pointer-events:none;position:absolute;overflow:visible;width:0;height:0;transform:translate(-50%,-50%);z-index:3}.axp-workflow-designer .axp-workflow-designer__port{position:absolute;flex-shrink:0;cursor:crosshair;border-radius:calc(infinity * 1px);left:50%;top:50%;transform:translate(-50%,-50%);width:14px;height:14px;padding:0;border:1px solid rgb(var(--ax-sys-color-surface));touch-action:none;pointer-events:auto;transition:transform .12s ease}.axp-workflow-designer .axp-workflow-designer__port:disabled{opacity:.45;cursor:not-allowed}.axp-workflow-designer .axp-workflow-designer__port--inbound{background:rgb(var(--ax-sys-color-success-500))}.axp-workflow-designer .axp-workflow-designer__port--outbound{background:rgb(var(--ax-sys-color-primary-500))}.axp-workflow-designer .axp-workflow-designer__port--active{box-shadow:0 0 0 3px #3b82f659}.axp-workflow-designer .axp-workflow-designer__port--link-hover{border:1px solid rgb(var(--ax-sys-color-primary-500));transform:translate(-50%,-50%) scale(1.12)}.axp-workflow-designer .axp-workflow-designer__port--disabled{opacity:.45;cursor:not-allowed}.axp-workflow-designer .axp-workflow-designer__resize{position:absolute;border-radius:calc(infinity * 1px);width:7px;height:7px;background:rgb(var(--ax-sys-color-primary-500));border:1px solid rgb(var(--ax-sys-color-surface));z-index:4;touch-action:none;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__resize--nw{left:-6px;top:-6px;cursor:nwse-resize}.axp-workflow-designer .axp-workflow-designer__resize--ne{right:-6px;top:-6px;cursor:nesw-resize}.axp-workflow-designer .axp-workflow-designer__resize--sw{left:-6px;bottom:-6px;cursor:nesw-resize}.axp-workflow-designer .axp-workflow-designer__resize--se{right:-6px;bottom:-6px;cursor:nwse-resize}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "directive", type: AXPanViewDirective, selector: "[axPanView]", inputs: ["zoomStep", "minZoom", "maxZoom", "freeMode", "fitContent", "disablePan", "disableZoom", "wrapperClasses", "panX", "panY", "zoom"], outputs: ["panXChange", "panYChange", "zoomChange", "positionChange"], exportAs: ["axPanView"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
4688
5052
  }
4689
5053
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWorkflowDesignerComponent, decorators: [{
4690
5054
  type: Component,
4691
5055
  args: [{ selector: 'axp-workflow-designer', imports: [CommonModule, AXDecoratorModule, AXButtonModule, AXPanViewDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
4692
5056
  class: 'axp-workflow-designer-host',
4693
5057
  '(window:keydown)': 'onWindowKeydown($event)',
4694
- }, template: "<div class=\"axp-workflow-designer\" [ngStyle]=\"gridStyle()\">\n <div\n #surface\n class=\"axp-workflow-designer__surface\"\n axPanView\n [(panX)]=\"panX\"\n [(panY)]=\"panY\"\n [(zoom)]=\"panZoomLevel\"\n [maxZoom]=\"10000\"\n [freeMode]=\"true\"\n [fitContent]=\"true\"\n wrapperClasses=\"h\"\n [ngStyle]=\"surfaceStyle()\"\n (pointerdown)=\"onSurfacePointerDown($event)\"\n (click)=\"onSurfaceClick($event)\"\n (dblclick)=\"onSurfaceDoubleClick($event)\"\n (dragover)=\"onCanvasDragOver($event)\"\n (drop)=\"onCanvasDrop($event)\"\n >\n <svg\n class=\"axp-workflow-designer__svg\"\n width=\"100%\"\n height=\"100%\"\n preserveAspectRatio=\"xMinYMin meet\"\n >\n <defs>\n <marker\n [attr.id]=\"svgMarkerId\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n refX=\"3.9\"\n refY=\"3\"\n orient=\"auto\"\n >\n <path\n d=\"M0,0 L4,3 L0,6 Q1.5,3 0,0 Z\"\n class=\"axp-workflow-designer__arrow-head\"\n ></path>\n </marker>\n </defs>\n @for (c of model().connectors; track c.id) {\n <path\n class=\"axp-workflow-designer__edge-hit\"\n [attr.d]=\"connectorPathD(c)\"\n fill=\"none\"\n stroke=\"transparent\"\n stroke-width=\"16\"\n pointer-events=\"stroke\"\n (click)=\"onConnectorClick(c, $event)\"\n (dblclick)=\"onConnectorDoubleClick(c, $event)\"\n />\n <path\n [class]=\"connectorEdgeClasses(c)\"\n [attr.d]=\"connectorPathD(c)\"\n fill=\"none\"\n [attr.marker-end]=\"'url(#' + svgMarkerId + ')'\"\n />\n }\n @if (linkDrag()) {\n <path\n class=\"axp-workflow-designer__edge-preview\"\n [attr.d]=\"previewPath()\"\n fill=\"none\"\n />\n }\n @if (showPortLabels()) {\n @for (node of model().nodes; track node.id) {\n @for (port of node.inboundPorts; track port.id) {\n @if (portLabelText(port)) {\n <text\n class=\"axp-workflow-designer__port-label-svg\"\n [attr.x]=\"portLabelX(node, port)\"\n [attr.y]=\"portLabelY(node, port)\"\n [attr.text-anchor]=\"portLabelAnchor(node, port)\"\n >\n {{ portLabelText(port) }}\n </text>\n }\n }\n @for (port of node.outboundPorts; track port.id) {\n @if (portLabelText(port)) {\n <text\n class=\"axp-workflow-designer__port-label-svg\"\n [attr.x]=\"portLabelX(node, port)\"\n [attr.y]=\"portLabelY(node, port)\"\n [attr.text-anchor]=\"portLabelAnchor(node, port)\"\n >\n {{ portLabelText(port) }}\n </text>\n }\n }\n }\n }\n </svg>\n\n @for (c of model().connectors; track c.id) {\n @if (isConnectorActive(c.id) && !isConnectorReadonly(c)) {\n <div\n class=\"axp-workflow-designer__connector-actions\"\n [style.left.px]=\"connectorMidpoint(c).x - 16\"\n [style.top.px]=\"connectorMidpoint(c).y - 16\"\n >\n <ax-button\n look=\"blank\"\n class=\"ax-sm axp-workflow-designer__icon-btn\"\n (onClick)=\"removeConnector(c)\"\n >\n <ax-icon class=\"fa-solid fa-minus\"></ax-icon>\n </ax-button>\n </div>\n }\n }\n\n @for (node of model().nodes; track node.id) {\n <div\n class=\"axp-workflow-designer__node\"\n [class.axp-workflow-designer__node--active]=\"isNodeActive(node.id)\"\n [class.axp-workflow-designer__node--highlighted]=\"\n isNodeHighlighted(node.id)\n \"\n [style.left.px]=\"nodeSurfaceLeft(node)\"\n [style.top.px]=\"nodeSurfaceTop(node)\"\n [style.width.px]=\"node.size.width\"\n [style.height.px]=\"node.size.height\"\n (pointerdown)=\"onNodePointerDown(node, $event)\"\n (click)=\"onNodeClick(node, $event)\"\n (dblclick)=\"onNodeDoubleClick(node, $event)\"\n (contextmenu)=\"onNodeContextMenu(node, $event)\"\n >\n <div [class]=\"nodeShapeClasses(node)\">\n <div\n class=\"axp-workflow-designer__node-body\"\n (pointerdown)=\"onNodeBodyPointerDown(node, $event)\"\n >\n @if (nodeBodyTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"templateContext(node)\"\n />\n } @else {\n <div class=\"axp-workflow-designer__node-default\">\n @if (node.icon) {\n <ax-icon\n class=\"axp-workflow-designer__node-default-icon\"\n [class]=\"node.icon\"\n ></ax-icon>\n }\n <span class=\"axp-workflow-designer__node-default-title\">{{\n node.title\n }}</span>\n </div>\n }\n </div>\n </div>\n\n @for (port of node.inboundPorts; track port.id) {\n <div\n class=\"axp-workflow-designer__port-cluster\"\n [class.axp-workflow-designer__port-cluster--side-top]=\"\n port.side === 'top'\n \"\n [class.axp-workflow-designer__port-cluster--side-right]=\"\n port.side === 'right'\n \"\n [class.axp-workflow-designer__port-cluster--side-bottom]=\"\n port.side === 'bottom'\n \"\n [class.axp-workflow-designer__port-cluster--side-left]=\"\n port.side === 'left'\n \"\n [ngStyle]=\"portClusterStyle(node, port)\"\n >\n <button\n type=\"button\"\n class=\"axp-workflow-designer__port axp-workflow-designer__port--inbound\"\n [class.axp-workflow-designer__port--active]=\"\n isPortActive(node.id, port.id)\n \"\n [class.axp-workflow-designer__port--link-hover]=\"\n isPortLinkHoverTarget(node.id, port.id)\n \"\n [class.axp-workflow-designer__port--disabled]=\"port.disabled\"\n [disabled]=\"isNodeReadonly(node) || port.disabled === true\"\n (pointerdown)=\"onPortPointerDown(node, port, $event)\"\n ></button>\n </div>\n }\n @for (port of node.outboundPorts; track port.id) {\n <div\n class=\"axp-workflow-designer__port-cluster\"\n [class.axp-workflow-designer__port-cluster--side-top]=\"\n port.side === 'top'\n \"\n [class.axp-workflow-designer__port-cluster--side-right]=\"\n port.side === 'right'\n \"\n [class.axp-workflow-designer__port-cluster--side-bottom]=\"\n port.side === 'bottom'\n \"\n [class.axp-workflow-designer__port-cluster--side-left]=\"\n port.side === 'left'\n \"\n [ngStyle]=\"portClusterStyle(node, port)\"\n >\n <button\n type=\"button\"\n class=\"axp-workflow-designer__port axp-workflow-designer__port--outbound\"\n [class.axp-workflow-designer__port--active]=\"\n isPortActive(node.id, port.id)\n \"\n [class.axp-workflow-designer__port--disabled]=\"port.disabled\"\n [disabled]=\"isNodeReadonly(node) || port.disabled === true\"\n (pointerdown)=\"onPortPointerDown(node, port, $event)\"\n ></button>\n </div>\n }\n\n @if (isNodeActive(node.id) && !isNodeReadonly(node)) {\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--nw\"\n (pointerdown)=\"onResizePointerDown(node, 'nw', $event)\"\n ></span>\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--ne\"\n (pointerdown)=\"onResizePointerDown(node, 'ne', $event)\"\n ></span>\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--sw\"\n (pointerdown)=\"onResizePointerDown(node, 'sw', $event)\"\n ></span>\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--se\"\n (pointerdown)=\"onResizePointerDown(node, 'se', $event)\"\n ></span>\n }\n </div>\n }\n </div>\n</div>\n", styles: ["@layer properties;.axp-workflow-designer-host{box-sizing:border-box;display:block;height:100%;width:100%;min-height:360px;user-select:none;-webkit-user-select:none}.axp-workflow-designer{display:flex;height:100%;width:100%;min-height:inherit}.axp-workflow-designer .axp-workflow-designer__surface{position:relative;min-height:100%;min-width:100%;flex:auto;overflow:auto;border-radius:10px;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__surface::ng-deep .pan-view__wrapper{height:100%;width:100%}.axp-workflow-designer .axp-workflow-designer__svg{pointer-events:none;position:absolute;inset:0;height:100%;width:100%;z-index:1}.axp-workflow-designer .axp-workflow-designer__edge-hit{pointer-events:stroke;cursor:pointer}.axp-workflow-designer .axp-workflow-designer__edge{pointer-events:none;stroke:rgb(var(--ax-sys-color-neutral-500));stroke-width:2;transition:stroke .12s ease}.axp-workflow-designer .axp-workflow-designer__edge.primary-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-primary-500))}.axp-workflow-designer .axp-workflow-designer__edge.secondary-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-secondary-500))}.axp-workflow-designer .axp-workflow-designer__edge.success-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-success-500))}.axp-workflow-designer .axp-workflow-designer__edge.warning-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-warning-500))}.axp-workflow-designer .axp-workflow-designer__edge.danger-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-danger-500))}.axp-workflow-designer .axp-workflow-designer__edge--active{stroke:rgb(var(--ax-sys-color-primary-500));stroke-dasharray:2}.axp-workflow-designer .axp-workflow-designer__edge-preview{pointer-events:none;stroke:rgb(var(--ax-sys-color-primary-400));stroke-width:2;stroke-dasharray:6 4}.axp-workflow-designer .axp-workflow-designer__port-label-svg{fill:rgb(var(--ax-sys-color-on-surface));font-size:10px;font-weight:600;dominant-baseline:middle;pointer-events:none;paint-order:stroke;stroke:rgb(var(--ax-sys-color-surface));stroke-width:4px;stroke-linejoin:round}.axp-workflow-designer .axp-workflow-designer__arrow-head{fill:rgb(var(--ax-sys-color-neutral-500))}.axp-workflow-designer .axp-workflow-designer__connector-actions{position:absolute;display:flex;align-items:center;justify-content:center;z-index:4}.axp-workflow-designer .axp-workflow-designer__icon-btn{border-radius:999px;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__node{position:absolute;box-sizing:border-box;z-index:2;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__node.axp-workflow-designer__node--active .axp-workflow-designer__node-shape{border:2px dotted rgb(var(--ax-sys-color-primary-500))}.axp-workflow-designer .axp-workflow-designer__node.axp-workflow-designer__node--highlighted .axp-workflow-designer__node-shape{border:2px solid rgb(var(--ax-sys-color-primary-500));box-shadow:0 0 0 3px rgb(var(--ax-sys-color-primary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape{position:absolute;inset:0;box-sizing:border-box;overflow:visible;background:rgb(var(--ax-sys-color-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-primary-surface{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-secondary-surface{background:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-success-surface{background:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-warning-surface{background:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-danger-surface{background:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-primary-border{border:2px solid rgb(var(--ax-sys-color-border-primary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-secondary-border{border:2px solid rgb(var(--ax-sys-color-border-secondary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-success-border{border:2px solid rgb(var(--ax-sys-color-border-success-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-warning-border{border:2px solid rgb(var(--ax-sys-color-border-warning-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-danger-border{border:2px solid rgb(var(--ax-sys-color-border-danger-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape--rectangle{border-radius:4px}.axp-workflow-designer .axp-workflow-designer__node-shape--rounded-rectangle{border-radius:14px}.axp-workflow-designer .axp-workflow-designer__node-shape--circle,.axp-workflow-designer .axp-workflow-designer__node-shape--ellipse{border-radius:50%}.axp-workflow-designer .axp-workflow-designer__node-shape--diamond{border-radius:0;clip-path:polygon(50% 0%,100% 50%,50% 100%,0% 50%)}.axp-workflow-designer .axp-workflow-designer__node-body{position:absolute;inset:0;display:flex;cursor:grab;align-items:center;justify-content:center;padding:8px 12px;touch-action:none;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__node-default{display:flex;min-width:0px;align-items:center;gap:8px}.axp-workflow-designer .axp-workflow-designer__node-default-icon{flex-shrink:0}.axp-workflow-designer .axp-workflow-designer__node-default-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.axp-workflow-designer .axp-workflow-designer__port-cluster{pointer-events:none;position:absolute;overflow:visible;width:0;height:0;transform:translate(-50%,-50%);z-index:3}.axp-workflow-designer .axp-workflow-designer__port{position:absolute;flex-shrink:0;cursor:crosshair;border-radius:calc(infinity * 1px);left:50%;top:50%;transform:translate(-50%,-50%);width:14px;height:14px;padding:0;border:1px solid rgb(var(--ax-sys-color-surface));touch-action:none;pointer-events:auto;transition:transform .12s ease}.axp-workflow-designer .axp-workflow-designer__port:disabled{opacity:.45;cursor:not-allowed}.axp-workflow-designer .axp-workflow-designer__port--inbound{background:rgb(var(--ax-sys-color-success-500))}.axp-workflow-designer .axp-workflow-designer__port--outbound{background:rgb(var(--ax-sys-color-primary-500))}.axp-workflow-designer .axp-workflow-designer__port--active{box-shadow:0 0 0 3px #3b82f659}.axp-workflow-designer .axp-workflow-designer__port--link-hover{border:1px solid rgb(var(--ax-sys-color-primary-500));transform:translate(-50%,-50%) scale(1.12)}.axp-workflow-designer .axp-workflow-designer__port--disabled{opacity:.45;cursor:not-allowed}.axp-workflow-designer .axp-workflow-designer__resize{position:absolute;border-radius:calc(infinity * 1px);width:7px;height:7px;background:rgb(var(--ax-sys-color-primary-500));border:1px solid rgb(var(--ax-sys-color-surface));z-index:4;touch-action:none;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__resize--nw{left:-6px;top:-6px;cursor:nwse-resize}.axp-workflow-designer .axp-workflow-designer__resize--ne{right:-6px;top:-6px;cursor:nesw-resize}.axp-workflow-designer .axp-workflow-designer__resize--sw{left:-6px;bottom:-6px;cursor:nesw-resize}.axp-workflow-designer .axp-workflow-designer__resize--se{right:-6px;bottom:-6px;cursor:nwse-resize}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
4695
- }], ctorParameters: () => [], propDecorators: { model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: true }] }], modelChange: [{ type: i0.Output, args: ["modelChange"] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], highlightedNodeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightedNodeIds", required: false }] }], gridSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "gridSize", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], connectionPreviewStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "connectionPreviewStyle", required: false }] }], backgroundPattern: [{ type: i0.Input, args: [{ isSignal: true, alias: "backgroundPattern", required: false }] }], zoomChange: [{ type: i0.Output, args: ["zoomChange"] }], canConnect: [{ type: i0.Input, args: [{ isSignal: true, alias: "canConnect", required: false }] }], paletteItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "paletteItems", required: false }] }], showPortLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPortLabels", required: false }] }], nodeBodyTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeBodyTemplate", required: false }] }], designerPointerDown: [{ type: i0.Output, args: ["designerPointerDown"] }], designerClick: [{ type: i0.Output, args: ["designerClick"] }], designerDoubleClick: [{ type: i0.Output, args: ["designerDoubleClick"] }], nodePointerDown: [{ type: i0.Output, args: ["nodePointerDown"] }], nodeClick: [{ type: i0.Output, args: ["nodeClick"] }], nodeDoubleClick: [{ type: i0.Output, args: ["nodeDoubleClick"] }], nodeContextMenu: [{ type: i0.Output, args: ["nodeContextMenu"] }], nodeDragStart: [{ type: i0.Output, args: ["nodeDragStart"] }], nodeDragEnd: [{ type: i0.Output, args: ["nodeDragEnd"] }], portPointerDown: [{ type: i0.Output, args: ["portPointerDown"] }], linkDragStart: [{ type: i0.Output, args: ["linkDragStart"] }], linkDragMove: [{ type: i0.Output, args: ["linkDragMove"] }], linkDragEnd: [{ type: i0.Output, args: ["linkDragEnd"] }], connectorClick: [{ type: i0.Output, args: ["connectorClick"] }], connectorDoubleClick: [{ type: i0.Output, args: ["connectorDoubleClick"] }], connectionCreated: [{ type: i0.Output, args: ["connectionCreated"] }], connectionRejected: [{ type: i0.Output, args: ["connectionRejected"] }], activationChange: [{ type: i0.Output, args: ["activationChange"] }], surfaceRef: [{ type: i0.ViewChild, args: ['surface', { isSignal: true }] }], panViewRef: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXPanViewDirective), { isSignal: true }] }] } });
5058
+ }, template: "<div class=\"axp-workflow-designer\" [ngStyle]=\"gridStyle()\">\n <div\n #surface\n class=\"axp-workflow-designer__surface\"\n axPanView\n [(panX)]=\"panX\"\n [(panY)]=\"panY\"\n [(zoom)]=\"panZoomLevel\"\n [maxZoom]=\"10000\"\n [freeMode]=\"true\"\n [fitContent]=\"true\"\n wrapperClasses=\"h\"\n [ngStyle]=\"surfaceStyle()\"\n (pointerdown)=\"onSurfacePointerDown($event)\"\n (click)=\"onSurfaceClick($event)\"\n (dblclick)=\"onSurfaceDoubleClick($event)\"\n (dragover)=\"onCanvasDragOver($event)\"\n (drop)=\"onCanvasDrop($event)\"\n >\n <svg\n class=\"axp-workflow-designer__svg\"\n width=\"100%\"\n height=\"100%\"\n preserveAspectRatio=\"xMinYMin meet\"\n >\n <defs>\n <marker\n [attr.id]=\"svgMarkerId\"\n markerWidth=\"6\"\n markerHeight=\"6\"\n refX=\"3.9\"\n refY=\"3\"\n orient=\"auto\"\n >\n <path\n d=\"M0,0 L4,3 L0,6 Q1.5,3 0,0 Z\"\n class=\"axp-workflow-designer__arrow-head\"\n ></path>\n </marker>\n </defs>\n @for (c of model().connectors; track c.id) {\n <path\n class=\"axp-workflow-designer__edge-hit\"\n [attr.d]=\"connectorPathD(c)\"\n fill=\"none\"\n stroke=\"transparent\"\n stroke-width=\"16\"\n pointer-events=\"stroke\"\n (click)=\"onConnectorClick(c, $event)\"\n (dblclick)=\"onConnectorDoubleClick(c, $event)\"\n />\n <path\n [class]=\"connectorEdgeClasses(c)\"\n [attr.d]=\"connectorPathD(c)\"\n fill=\"none\"\n [attr.marker-end]=\"'url(#' + svgMarkerId + ')'\"\n />\n }\n @if (linkDrag()) {\n <path\n class=\"axp-workflow-designer__edge-preview\"\n [attr.d]=\"previewPath()\"\n fill=\"none\"\n />\n }\n </svg>\n\n @for (c of model().connectors; track c.id) {\n @if (isConnectorActive(c.id) && !isConnectorReadonly(c)) {\n <div\n class=\"axp-workflow-designer__connector-actions\"\n [style.left.px]=\"connectorMidpoint(c).x - 16\"\n [style.top.px]=\"connectorMidpoint(c).y - 16\"\n >\n <ax-button\n look=\"blank\"\n class=\"ax-sm axp-workflow-designer__icon-btn\"\n (onClick)=\"removeConnector(c)\"\n >\n <ax-icon class=\"fa-solid fa-minus\"></ax-icon>\n </ax-button>\n </div>\n }\n }\n\n @for (node of model().nodes; track node.id) {\n <div\n class=\"axp-workflow-designer__node\"\n [class.axp-workflow-designer__node--active]=\"isNodeActive(node.id)\"\n [class.axp-workflow-designer__node--highlighted]=\"\n isNodeHighlighted(node.id)\n \"\n [style.left.px]=\"nodeSurfaceLeft(node)\"\n [style.top.px]=\"nodeSurfaceTop(node)\"\n [style.width.px]=\"node.size.width\"\n [style.height.px]=\"node.size.height\"\n (pointerdown)=\"onNodePointerDown(node, $event)\"\n (click)=\"onNodeClick(node, $event)\"\n (dblclick)=\"onNodeDoubleClick(node, $event)\"\n (contextmenu)=\"onNodeContextMenu(node, $event)\"\n >\n <div [class]=\"nodeShapeClasses(node)\">\n <div\n class=\"axp-workflow-designer__node-body\"\n (pointerdown)=\"onNodeBodyPointerDown(node, $event)\"\n >\n @if (nodeBodyTemplate(); as tpl) {\n <ng-container\n [ngTemplateOutlet]=\"tpl\"\n [ngTemplateOutletContext]=\"templateContext(node)\"\n />\n } @else {\n <div class=\"axp-workflow-designer__node-default\">\n @if (node.icon) {\n <ax-icon\n class=\"axp-workflow-designer__node-default-icon\"\n [class]=\"node.icon\"\n ></ax-icon>\n }\n <span class=\"axp-workflow-designer__node-default-title\">{{\n node.title\n }}</span>\n </div>\n }\n </div>\n </div>\n\n <!--->\n <!-- ----- Optional inbound / outbound port markers ----- -->\n @if (showPorts()) {\n @for (port of node.inboundPorts; track port.id) {\n <div\n class=\"axp-workflow-designer__port-cluster\"\n [class.axp-workflow-designer__port-cluster--side-top]=\"\n port.side === 'top'\n \"\n [class.axp-workflow-designer__port-cluster--side-right]=\"\n port.side === 'right'\n \"\n [class.axp-workflow-designer__port-cluster--side-bottom]=\"\n port.side === 'bottom'\n \"\n [class.axp-workflow-designer__port-cluster--side-left]=\"\n port.side === 'left'\n \"\n [ngStyle]=\"portClusterStyle(node, port)\"\n >\n <button\n type=\"button\"\n class=\"axp-workflow-designer__port axp-workflow-designer__port--inbound\"\n [class.axp-workflow-designer__port--active]=\"\n isPortActive(node.id, port.id)\n \"\n [class.axp-workflow-designer__port--link-hover]=\"\n isPortLinkHoverTarget(node.id, port.id)\n \"\n [class.axp-workflow-designer__port--disabled]=\"port.disabled\"\n [disabled]=\"isNodeReadonly(node) || port.disabled === true\"\n (pointerdown)=\"onPortPointerDown(node, port, $event)\"\n ></button>\n </div>\n }\n @for (port of node.outboundPorts; track port.id) {\n <div\n class=\"axp-workflow-designer__port-cluster\"\n [class.axp-workflow-designer__port-cluster--side-top]=\"\n port.side === 'top'\n \"\n [class.axp-workflow-designer__port-cluster--side-right]=\"\n port.side === 'right'\n \"\n [class.axp-workflow-designer__port-cluster--side-bottom]=\"\n port.side === 'bottom'\n \"\n [class.axp-workflow-designer__port-cluster--side-left]=\"\n port.side === 'left'\n \"\n [ngStyle]=\"portClusterStyle(node, port)\"\n >\n <button\n type=\"button\"\n class=\"axp-workflow-designer__port axp-workflow-designer__port--outbound\"\n [class.axp-workflow-designer__port--active]=\"\n isPortActive(node.id, port.id)\n \"\n [class.axp-workflow-designer__port--disabled]=\"port.disabled\"\n [disabled]=\"isNodeReadonly(node) || port.disabled === true\"\n (pointerdown)=\"onPortPointerDown(node, port, $event)\"\n ></button>\n </div>\n }\n }\n\n @if (isNodeActive(node.id) && !isNodeReadonly(node)) {\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--nw\"\n (pointerdown)=\"onResizePointerDown(node, 'nw', $event)\"\n ></span>\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--ne\"\n (pointerdown)=\"onResizePointerDown(node, 'ne', $event)\"\n ></span>\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--sw\"\n (pointerdown)=\"onResizePointerDown(node, 'sw', $event)\"\n ></span>\n <span\n class=\"axp-workflow-designer__resize axp-workflow-designer__resize--se\"\n (pointerdown)=\"onResizePointerDown(node, 'se', $event)\"\n ></span>\n }\n </div>\n }\n\n <svg\n class=\"axp-workflow-designer__svg axp-workflow-designer__svg--labels\"\n width=\"100%\"\n height=\"100%\"\n preserveAspectRatio=\"xMinYMin meet\"\n >\n @if (showPortLabels()) {\n @for (node of model().nodes; track node.id) {\n @for (port of node.inboundPorts; track port.id) {\n <!--->\n <!-- ----- Cardinality / port name on the inbound side ----- -->\n @if (portLabelText(port)) {\n <text\n class=\"axp-workflow-designer__port-label-svg\"\n [attr.x]=\"portLabelX(node, port)\"\n [attr.y]=\"portLabelY(node, port)\"\n [attr.text-anchor]=\"portLabelAnchor(port)\"\n >\n {{ portLabelText(port) }}\n </text>\n }\n }\n @for (port of node.outboundPorts; track port.id) {\n <!--->\n <!-- ----- Cardinality / port name on the outbound side ----- -->\n @if (portLabelText(port)) {\n <text\n class=\"axp-workflow-designer__port-label-svg\"\n [attr.x]=\"portLabelX(node, port)\"\n [attr.y]=\"portLabelY(node, port)\"\n [attr.text-anchor]=\"portLabelAnchor(port)\"\n >\n {{ portLabelText(port) }}\n </text>\n }\n }\n }\n }\n @if (showConnectorLabels()) {\n @for (c of model().connectors; track c.id) {\n <!--->\n <!-- ----- Skip connectors without a label ----- -->\n @if (connectorLabelText(c); as text) {\n <!--->\n <!-- ----- Relation name beside the longest connector segment ----- -->\n @if (connectorLabelPoint(c); as point) {\n <text\n class=\"axp-workflow-designer__edge-label-svg\"\n [attr.x]=\"point.x\"\n [attr.y]=\"point.y\"\n text-anchor=\"middle\"\n >\n {{ text }}\n </text>\n }\n }\n }\n }\n </svg>\n </div>\n</div>\n", styles: ["@layer properties;.axp-workflow-designer-host{box-sizing:border-box;display:block;height:100%;width:100%;min-height:360px;user-select:none;-webkit-user-select:none}.axp-workflow-designer{display:flex;height:100%;width:100%;min-height:inherit}.axp-workflow-designer .axp-workflow-designer__surface{position:relative;min-height:100%;min-width:100%;flex:auto;overflow:auto;border-radius:10px;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__surface::ng-deep .pan-view__wrapper{height:100%;width:100%}.axp-workflow-designer .axp-workflow-designer__svg{pointer-events:none;position:absolute;inset:0;height:100%;width:100%;z-index:1}.axp-workflow-designer .axp-workflow-designer__svg--labels{z-index:4}.axp-workflow-designer .axp-workflow-designer__edge-hit{pointer-events:stroke;cursor:pointer}.axp-workflow-designer .axp-workflow-designer__edge{pointer-events:none;stroke:rgb(var(--ax-sys-color-neutral-500));stroke-width:2;transition:stroke .12s ease}.axp-workflow-designer .axp-workflow-designer__edge.primary-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-primary-500))}.axp-workflow-designer .axp-workflow-designer__edge.secondary-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-secondary-500))}.axp-workflow-designer .axp-workflow-designer__edge.success-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-success-500))}.axp-workflow-designer .axp-workflow-designer__edge.warning-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-warning-500))}.axp-workflow-designer .axp-workflow-designer__edge.danger-surface:not(.axp-workflow-designer__edge--active){stroke:rgb(var(--ax-sys-color-danger-500))}.axp-workflow-designer .axp-workflow-designer__edge--active{stroke:rgb(var(--ax-sys-color-primary-500));stroke-dasharray:2}.axp-workflow-designer .axp-workflow-designer__edge-preview{pointer-events:none;stroke:rgb(var(--ax-sys-color-primary-400));stroke-width:2;stroke-dasharray:6 4}.axp-workflow-designer .axp-workflow-designer__port-label-svg,.axp-workflow-designer .axp-workflow-designer__edge-label-svg{fill:rgb(var(--ax-sys-color-on-surface));font-size:10px;font-weight:600;dominant-baseline:middle;pointer-events:none;paint-order:stroke;stroke:rgb(var(--ax-sys-color-surface));stroke-width:4px;stroke-linejoin:round}.axp-workflow-designer .axp-workflow-designer__arrow-head{fill:rgb(var(--ax-sys-color-neutral-500))}.axp-workflow-designer .axp-workflow-designer__connector-actions{position:absolute;display:flex;align-items:center;justify-content:center;z-index:4}.axp-workflow-designer .axp-workflow-designer__icon-btn{border-radius:999px;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__node{position:absolute;box-sizing:border-box;z-index:2;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__node.axp-workflow-designer__node--active .axp-workflow-designer__node-shape{border:2px dotted rgb(var(--ax-sys-color-primary-500))}.axp-workflow-designer .axp-workflow-designer__node.axp-workflow-designer__node--highlighted .axp-workflow-designer__node-shape{border:2px solid rgb(var(--ax-sys-color-primary-500));box-shadow:0 0 0 3px rgb(var(--ax-sys-color-primary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape{position:absolute;inset:0;box-sizing:border-box;overflow:visible;background:rgb(var(--ax-sys-color-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-primary-surface{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-secondary-surface{background:rgb(var(--ax-sys-color-secondary-surface));color:rgb(var(--ax-sys-color-on-secondary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-success-surface{background:rgb(var(--ax-sys-color-success-surface));color:rgb(var(--ax-sys-color-on-success-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-warning-surface{background:rgb(var(--ax-sys-color-warning-surface));color:rgb(var(--ax-sys-color-on-warning-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-danger-surface{background:rgb(var(--ax-sys-color-danger-surface));color:rgb(var(--ax-sys-color-on-danger-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-primary-border{border:2px solid rgb(var(--ax-sys-color-border-primary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-secondary-border{border:2px solid rgb(var(--ax-sys-color-border-secondary-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-success-border{border:2px solid rgb(var(--ax-sys-color-border-success-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-warning-border{border:2px solid rgb(var(--ax-sys-color-border-warning-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape.axp-danger-border{border:2px solid rgb(var(--ax-sys-color-border-danger-surface))}.axp-workflow-designer .axp-workflow-designer__node-shape--rectangle{border-radius:4px}.axp-workflow-designer .axp-workflow-designer__node-shape--rounded-rectangle{border-radius:14px}.axp-workflow-designer .axp-workflow-designer__node-shape--circle,.axp-workflow-designer .axp-workflow-designer__node-shape--ellipse{border-radius:50%}.axp-workflow-designer .axp-workflow-designer__node-shape--diamond{border-radius:0;clip-path:polygon(50% 0%,100% 50%,50% 100%,0% 50%)}.axp-workflow-designer .axp-workflow-designer__node-body{position:absolute;inset:0;display:flex;cursor:grab;align-items:center;justify-content:center;padding:8px 12px;touch-action:none;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__node-default{display:flex;min-width:0px;align-items:center;gap:8px}.axp-workflow-designer .axp-workflow-designer__node-default-icon{flex-shrink:0}.axp-workflow-designer .axp-workflow-designer__node-default-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.axp-workflow-designer .axp-workflow-designer__port-cluster{pointer-events:none;position:absolute;overflow:visible;width:0;height:0;transform:translate(-50%,-50%);z-index:3}.axp-workflow-designer .axp-workflow-designer__port{position:absolute;flex-shrink:0;cursor:crosshair;border-radius:calc(infinity * 1px);left:50%;top:50%;transform:translate(-50%,-50%);width:14px;height:14px;padding:0;border:1px solid rgb(var(--ax-sys-color-surface));touch-action:none;pointer-events:auto;transition:transform .12s ease}.axp-workflow-designer .axp-workflow-designer__port:disabled{opacity:.45;cursor:not-allowed}.axp-workflow-designer .axp-workflow-designer__port--inbound{background:rgb(var(--ax-sys-color-success-500))}.axp-workflow-designer .axp-workflow-designer__port--outbound{background:rgb(var(--ax-sys-color-primary-500))}.axp-workflow-designer .axp-workflow-designer__port--active{box-shadow:0 0 0 3px #3b82f659}.axp-workflow-designer .axp-workflow-designer__port--link-hover{border:1px solid rgb(var(--ax-sys-color-primary-500));transform:translate(-50%,-50%) scale(1.12)}.axp-workflow-designer .axp-workflow-designer__port--disabled{opacity:.45;cursor:not-allowed}.axp-workflow-designer .axp-workflow-designer__resize{position:absolute;border-radius:calc(infinity * 1px);width:7px;height:7px;background:rgb(var(--ax-sys-color-primary-500));border:1px solid rgb(var(--ax-sys-color-surface));z-index:4;touch-action:none;user-select:none;-webkit-user-select:none}.axp-workflow-designer .axp-workflow-designer__resize--nw{left:-6px;top:-6px;cursor:nwse-resize}.axp-workflow-designer .axp-workflow-designer__resize--ne{right:-6px;top:-6px;cursor:nesw-resize}.axp-workflow-designer .axp-workflow-designer__resize--sw{left:-6px;bottom:-6px;cursor:nesw-resize}.axp-workflow-designer .axp-workflow-designer__resize--se{right:-6px;bottom:-6px;cursor:nwse-resize}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
5059
+ }], ctorParameters: () => [], propDecorators: { model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: true }] }], modelChange: [{ type: i0.Output, args: ["modelChange"] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], highlightedNodeIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightedNodeIds", required: false }] }], gridSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "gridSize", required: false }] }], snapToGrid: [{ type: i0.Input, args: [{ isSignal: true, alias: "snapToGrid", required: false }] }], connectionPreviewStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "connectionPreviewStyle", required: false }] }], connectorStub: [{ type: i0.Input, args: [{ isSignal: true, alias: "connectorStub", required: false }] }], backgroundPattern: [{ type: i0.Input, args: [{ isSignal: true, alias: "backgroundPattern", required: false }] }], zoomChange: [{ type: i0.Output, args: ["zoomChange"] }], canConnect: [{ type: i0.Input, args: [{ isSignal: true, alias: "canConnect", required: false }] }], paletteItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "paletteItems", required: false }] }], showPortLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPortLabels", required: false }] }], showPorts: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPorts", required: false }] }], showConnectorLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showConnectorLabels", required: false }] }], canvasPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "canvasPadding", required: false }] }], minCanvasSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minCanvasSize", required: false }] }], nodeBodyTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeBodyTemplate", required: false }] }], designerPointerDown: [{ type: i0.Output, args: ["designerPointerDown"] }], designerClick: [{ type: i0.Output, args: ["designerClick"] }], designerDoubleClick: [{ type: i0.Output, args: ["designerDoubleClick"] }], nodePointerDown: [{ type: i0.Output, args: ["nodePointerDown"] }], nodeClick: [{ type: i0.Output, args: ["nodeClick"] }], nodeDoubleClick: [{ type: i0.Output, args: ["nodeDoubleClick"] }], nodeContextMenu: [{ type: i0.Output, args: ["nodeContextMenu"] }], nodeDragStart: [{ type: i0.Output, args: ["nodeDragStart"] }], nodeDragEnd: [{ type: i0.Output, args: ["nodeDragEnd"] }], portPointerDown: [{ type: i0.Output, args: ["portPointerDown"] }], linkDragStart: [{ type: i0.Output, args: ["linkDragStart"] }], linkDragMove: [{ type: i0.Output, args: ["linkDragMove"] }], linkDragEnd: [{ type: i0.Output, args: ["linkDragEnd"] }], connectorClick: [{ type: i0.Output, args: ["connectorClick"] }], connectorDoubleClick: [{ type: i0.Output, args: ["connectorDoubleClick"] }], connectionCreated: [{ type: i0.Output, args: ["connectionCreated"] }], connectionRejected: [{ type: i0.Output, args: ["connectionRejected"] }], activationChange: [{ type: i0.Output, args: ["activationChange"] }], surfaceRef: [{ type: i0.ViewChild, args: ['surface', { isSignal: true }] }], panViewRef: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXPanViewDirective), { isSignal: true }] }] } });
4696
5060
 
4697
5061
  /**
4698
5062
  * Makes any host element a draggable palette source. Set `[axpWorkflowPaletteItem]="item"` and optional outputs.
@@ -4753,5 +5117,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
4753
5117
  * Generated bundle index. Do not edit.
4754
5118
  */
4755
5119
 
4756
- export { AXPMenuManagementService as A, snapPoint as B, snapScalar as C, REST_API_GENERATOR_WIDGET_NAME as R, REST_API_GENERATOR_IMPORT_DEBOUNCE_MS as a, AXMPlatformManagementModule as b, createEmptyRestApiOutput as c, AXPWorkflowDesignerComponent as d, AXPWorkflowPaletteItemDragDirective as e, formatRestApiSummary as f, AXP_WORKFLOW_PALETTE_MIME as g, hasParsedContent as h, arrangeWorkflowDiagram as i, cloneDiagram as j, connectorPath as k, createNodeFromPaletteItem as l, createPortsFromPalette as m, normalizeRestApiOutput as n, createWorkflowConnectorId as o, parseHttpRequest as p, createWorkflowNodeId as q, createWorkflowPortId as r, defaultCanConnectRequest as s, findConnector as t, findNode as u, findPort as v, parsePaletteItemDragPayload as w, portAnchorOnNode as x, portCanvasPosition as y, routeOrthogonalConnector as z };
4757
- //# sourceMappingURL=acorex-platform-module-platform-management-client-acorex-platform-module-platform-management-client-BGVhn6wv.mjs.map
5120
+ export { AXPMenuManagementService as A, findPort as B, CREATE_USER_QUERY_I18N as C, longestConnectorSegment as D, offsetPointOffSegment as E, parsePaletteItemDragPayload as F, portAnchorOnNode as G, portCanvasPosition as H, routeOrthogonalConnector as I, snapPoint as J, snapScalar as K, QUERY_CONTRACT_WIDGET_NAME as Q, REST_API_GENERATOR_WIDGET_NAME as R, USER_QUERY_KIND_OPTIONS as U, CREATE_USER_QUERY_WIZARD_NAME as a, CREATE_USER_QUERY_ENTITY_CATALOG as b, createEmptyRestApiOutput as c, USER_QUERY_VALUE_TYPE_OPTIONS as d, USER_QUERY_MEASURE_REDUCER_OPTIONS as e, REST_API_GENERATOR_IMPORT_DEBOUNCE_MS as f, formatRestApiSummary as g, hasParsedContent as h, AXMPlatformManagementModule as i, AXPWorkflowDesignerComponent as j, AXPWorkflowPaletteItemDragDirective as k, AXP_WORKFLOW_PALETTE_MIME as l, arrangeWorkflowDiagram as m, normalizeRestApiOutput as n, cloneDiagram as o, parseHttpRequest as p, connectorPath as q, connectorRoutePoints as r, createNodeFromPaletteItem as s, createPortsFromPalette as t, createWorkflowConnectorId as u, createWorkflowNodeId as v, createWorkflowPortId as w, defaultCanConnectRequest as x, findConnector as y, findNode as z };
5121
+ //# sourceMappingURL=acorex-platform-module-platform-management-client-acorex-platform-module-platform-management-client-YuJijjKh.mjs.map