@acorex-platform/extension-project-management-jira-client 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/acorex-platform-extension-project-management-jira-client-connect-jira.command-DNMUeLqv.mjs +346 -0
- package/fesm2022/acorex-platform-extension-project-management-jira-client-connect-jira.command-DNMUeLqv.mjs.map +1 -0
- package/fesm2022/acorex-platform-extension-project-management-jira-client-contracts.mjs +188 -0
- package/fesm2022/acorex-platform-extension-project-management-jira-client-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-extension-project-management-jira-client.mjs +1017 -0
- package/fesm2022/acorex-platform-extension-project-management-jira-client.mjs.map +1 -0
- package/package.json +28 -0
- package/types/acorex-platform-extension-project-management-jira-client-contracts.d.ts +221 -0
- package/types/acorex-platform-extension-project-management-jira-client.d.ts +80 -0
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import { resolveMultiLanguageString, AXP_INTEGRATION_AUTH_METHOD_TYPE, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';
|
|
2
|
+
import { AXMIntegrationManagementCommandKeys } from '@acorex-platform/module-integration-management-client/contracts';
|
|
3
|
+
import { AXPSessionService } from '@acorex-platform/framework-client/auth';
|
|
4
|
+
import { AXPLayoutBuilderService, resolveLayoutBuilderDialogResult } from '@acorex-platform/framework-client/layout/builder';
|
|
5
|
+
import { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';
|
|
6
|
+
import { AXPCommandService } from '@acorex-platform/framework-client/runtime';
|
|
7
|
+
import { AXPopupService } from '@acorex/components/popup';
|
|
8
|
+
import * as i7 from '@acorex/core/translation';
|
|
9
|
+
import { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';
|
|
10
|
+
import * as i0 from '@angular/core';
|
|
11
|
+
import { ChangeDetectionStrategy, Component, inject, Injectable } from '@angular/core';
|
|
12
|
+
import { defaultTo, trim } from 'lodash-es';
|
|
13
|
+
import { RootConfig } from '@acorex-platform/extension-project-management-jira-client/contracts';
|
|
14
|
+
import * as i2 from '@acorex/components/button';
|
|
15
|
+
import { AXButtonModule } from '@acorex/components/button';
|
|
16
|
+
import * as i4 from '@acorex/components/decorators';
|
|
17
|
+
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
18
|
+
import { AXBasePageComponent } from '@acorex/components/page';
|
|
19
|
+
import * as i3 from '@acorex/components/selection-list';
|
|
20
|
+
import { AXSelectionListModule } from '@acorex/components/selection-list';
|
|
21
|
+
import { AsyncPipe } from '@angular/common';
|
|
22
|
+
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region ---- Component ----
|
|
25
|
+
class AXMJiraInstancePickerPopupComponent extends AXBasePageComponent {
|
|
26
|
+
constructor() {
|
|
27
|
+
super(...arguments);
|
|
28
|
+
this.instances = [];
|
|
29
|
+
}
|
|
30
|
+
instanceListItems() {
|
|
31
|
+
return this.instances.map((instance) => ({
|
|
32
|
+
id: instance.id,
|
|
33
|
+
title: this.instanceTitle(instance),
|
|
34
|
+
deploymentLabelKey: this.deploymentLabelKey(instance),
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
handleInstanceSelection(event) {
|
|
38
|
+
if (!event.isUserInteraction) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const instance = this.instances.find((item) => item.id === event.value);
|
|
42
|
+
if (instance) {
|
|
43
|
+
this.selectInstance(instance);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
instanceTitle(instance) {
|
|
47
|
+
return resolveMultiLanguageString(instance.title, 'en-US');
|
|
48
|
+
}
|
|
49
|
+
deploymentLabelKey(instance) {
|
|
50
|
+
return instance.deploymentType === 'cloud'
|
|
51
|
+
? '@extensions-jira:instances.entities.instance.fields.deployment-type.options.cloud'
|
|
52
|
+
: '@extensions-jira:instances.entities.instance.fields.deployment-type.options.self-hosted';
|
|
53
|
+
}
|
|
54
|
+
selectInstance(instance) {
|
|
55
|
+
this.close({ instance });
|
|
56
|
+
}
|
|
57
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMJiraInstancePickerPopupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
58
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMJiraInstancePickerPopupComponent, isStandalone: true, selector: "axm-jira-instance-picker-popup", usesInheritance: true, ngImport: i0, template: `
|
|
59
|
+
<div class="flex flex-col gap-2 p-4">
|
|
60
|
+
@if (instances.length === 0) {
|
|
61
|
+
<p class="text-sm opacity-70">
|
|
62
|
+
{{ '@extensions-jira:integration.connect.instance-picker.empty' | translate | async }}
|
|
63
|
+
</p>
|
|
64
|
+
} @else {
|
|
65
|
+
<ax-selection-list
|
|
66
|
+
class="w-full"
|
|
67
|
+
valueField="id"
|
|
68
|
+
textField="title"
|
|
69
|
+
[direction]="'vertical'"
|
|
70
|
+
[look]="'solid'"
|
|
71
|
+
[multiple]="false"
|
|
72
|
+
[showControl]="false"
|
|
73
|
+
[items]="instanceListItems()"
|
|
74
|
+
[customTemplate]="instanceItemTemplate"
|
|
75
|
+
(onValueChanged)="handleInstanceSelection($event)"
|
|
76
|
+
>
|
|
77
|
+
<ng-template #instanceItemTemplate let-item>
|
|
78
|
+
<div class="flex w-full flex-col items-start gap-0.5 py-1">
|
|
79
|
+
<span class="font-medium">{{ item.data.title }}</span>
|
|
80
|
+
<span class="text-xs opacity-70">{{ item.data.deploymentLabelKey | translate | async }}</span>
|
|
81
|
+
</div>
|
|
82
|
+
</ng-template>
|
|
83
|
+
</ax-selection-list>
|
|
84
|
+
}
|
|
85
|
+
</div>
|
|
86
|
+
<ax-footer>
|
|
87
|
+
<ax-suffix>
|
|
88
|
+
<ax-button
|
|
89
|
+
look="outline"
|
|
90
|
+
[text]="'@general:actions.cancel.title' | translate | async"
|
|
91
|
+
(onClick)="close()"
|
|
92
|
+
></ax-button>
|
|
93
|
+
</ax-suffix>
|
|
94
|
+
</ax-footer>
|
|
95
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i4.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXSelectionListModule }, { kind: "component", type: i3.AXSelectionListComponent, selector: "ax-selection-list", inputs: ["id", "name", "disabled", "readonly", "tabIndex", "size", "value", "valueField", "textField", "disabledField", "readonlyField", "multiple", "direction", "customTemplate", "showControl", "items", "look"], outputs: ["onValueChanged", "onBlur", "onFocus"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: i7.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
96
|
+
}
|
|
97
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMJiraInstancePickerPopupComponent, decorators: [{
|
|
98
|
+
type: Component,
|
|
99
|
+
args: [{
|
|
100
|
+
selector: 'axm-jira-instance-picker-popup',
|
|
101
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
102
|
+
imports: [AsyncPipe, AXButtonModule, AXDecoratorModule, AXSelectionListModule, AXTranslationModule],
|
|
103
|
+
template: `
|
|
104
|
+
<div class="flex flex-col gap-2 p-4">
|
|
105
|
+
@if (instances.length === 0) {
|
|
106
|
+
<p class="text-sm opacity-70">
|
|
107
|
+
{{ '@extensions-jira:integration.connect.instance-picker.empty' | translate | async }}
|
|
108
|
+
</p>
|
|
109
|
+
} @else {
|
|
110
|
+
<ax-selection-list
|
|
111
|
+
class="w-full"
|
|
112
|
+
valueField="id"
|
|
113
|
+
textField="title"
|
|
114
|
+
[direction]="'vertical'"
|
|
115
|
+
[look]="'solid'"
|
|
116
|
+
[multiple]="false"
|
|
117
|
+
[showControl]="false"
|
|
118
|
+
[items]="instanceListItems()"
|
|
119
|
+
[customTemplate]="instanceItemTemplate"
|
|
120
|
+
(onValueChanged)="handleInstanceSelection($event)"
|
|
121
|
+
>
|
|
122
|
+
<ng-template #instanceItemTemplate let-item>
|
|
123
|
+
<div class="flex w-full flex-col items-start gap-0.5 py-1">
|
|
124
|
+
<span class="font-medium">{{ item.data.title }}</span>
|
|
125
|
+
<span class="text-xs opacity-70">{{ item.data.deploymentLabelKey | translate | async }}</span>
|
|
126
|
+
</div>
|
|
127
|
+
</ng-template>
|
|
128
|
+
</ax-selection-list>
|
|
129
|
+
}
|
|
130
|
+
</div>
|
|
131
|
+
<ax-footer>
|
|
132
|
+
<ax-suffix>
|
|
133
|
+
<ax-button
|
|
134
|
+
look="outline"
|
|
135
|
+
[text]="'@general:actions.cancel.title' | translate | async"
|
|
136
|
+
(onClick)="close()"
|
|
137
|
+
></ax-button>
|
|
138
|
+
</ax-suffix>
|
|
139
|
+
</ax-footer>
|
|
140
|
+
`,
|
|
141
|
+
}]
|
|
142
|
+
}] });
|
|
143
|
+
|
|
144
|
+
//#endregion
|
|
145
|
+
//#region ---- Command ----
|
|
146
|
+
/** Jira connect: pick instance → self-hosted PAT or cloud OAuth2. */
|
|
147
|
+
class ConnectJiraCommand {
|
|
148
|
+
constructor() {
|
|
149
|
+
//#region ---- Services & Dependencies ----
|
|
150
|
+
this.popupService = inject(AXPopupService);
|
|
151
|
+
this.translationService = inject(AXTranslationService);
|
|
152
|
+
this.entityService = inject(AXPEntityService);
|
|
153
|
+
this.layoutBuilder = inject(AXPLayoutBuilderService);
|
|
154
|
+
this.commandService = inject(AXPCommandService);
|
|
155
|
+
this.sessionService = inject(AXPSessionService);
|
|
156
|
+
}
|
|
157
|
+
//#endregion
|
|
158
|
+
//#region ---- Execute ----
|
|
159
|
+
async execute(input = {}) {
|
|
160
|
+
try {
|
|
161
|
+
const providerId = defaultTo(input.providerId, 'jira');
|
|
162
|
+
const connectionScope = input.connectionScope ?? 'tenant';
|
|
163
|
+
const I18N = '@extensions-jira:integration.connect';
|
|
164
|
+
const instance = await this.pickInstance();
|
|
165
|
+
if (!instance) {
|
|
166
|
+
return { success: true, kind: 'object', data: { outcome: 'cancelled' } };
|
|
167
|
+
}
|
|
168
|
+
if (instance.deploymentType === 'selfHosted') {
|
|
169
|
+
return this.connectSelfHosted(providerId, connectionScope, instance, I18N);
|
|
170
|
+
}
|
|
171
|
+
return this.connectCloud(providerId, connectionScope, instance, I18N);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
const message = error instanceof Error ? error.message : 'Failed to connect Jira instance.';
|
|
175
|
+
return { success: false, message: { text: message } };
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//#endregion
|
|
179
|
+
//#region ---- Instance Picker ----
|
|
180
|
+
async pickInstance() {
|
|
181
|
+
const instances = await this.loadActiveInstances();
|
|
182
|
+
const title = await this.translationService.translateAsync('@extensions-jira:integration.connect.instance-picker.title');
|
|
183
|
+
const result = await this.popupService.open(AXMJiraInstancePickerPopupComponent, {
|
|
184
|
+
title,
|
|
185
|
+
size: 'sm',
|
|
186
|
+
data: { instances },
|
|
187
|
+
});
|
|
188
|
+
return result?.data?.instance ?? null;
|
|
189
|
+
}
|
|
190
|
+
async loadActiveInstances() {
|
|
191
|
+
const accessor = this.entityService
|
|
192
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.jiraInstance.name)
|
|
193
|
+
.data();
|
|
194
|
+
const result = await accessor.query({
|
|
195
|
+
skip: 0,
|
|
196
|
+
take: 200,
|
|
197
|
+
filter: {
|
|
198
|
+
logic: 'and',
|
|
199
|
+
filters: [{ field: 'isActive', operator: { type: 'equal' }, value: true }],
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
return result.items ?? [];
|
|
203
|
+
}
|
|
204
|
+
//#endregion
|
|
205
|
+
//#region ---- Self-Hosted (PAT) ----
|
|
206
|
+
async connectSelfHosted(providerId, connectionScope, instance, i18nPrefix) {
|
|
207
|
+
const form = await this.openPatDialog({
|
|
208
|
+
i18nPrefix,
|
|
209
|
+
context: {
|
|
210
|
+
displayName: instance.name,
|
|
211
|
+
instanceUrl: defaultTo(instance.baseUrl, ''),
|
|
212
|
+
token: '',
|
|
213
|
+
},
|
|
214
|
+
instanceUrlReadonly: true,
|
|
215
|
+
});
|
|
216
|
+
if (!form) {
|
|
217
|
+
return { success: true, kind: 'object', data: { outcome: 'cancelled' } };
|
|
218
|
+
}
|
|
219
|
+
const result = await this.commandService.execute(AXMIntegrationManagementCommandKeys.ConnectionConnectWithCredentials, {
|
|
220
|
+
providerId,
|
|
221
|
+
authMethodType: AXP_INTEGRATION_AUTH_METHOD_TYPE.Pat,
|
|
222
|
+
connectionScope,
|
|
223
|
+
connectionKey: instance.name,
|
|
224
|
+
displayName: defaultTo(trim(form.displayName), instance.name),
|
|
225
|
+
instanceUrl: defaultTo(trim(form.instanceUrl), defaultTo(instance.baseUrl, '')),
|
|
226
|
+
credentials: { token: form.token },
|
|
227
|
+
config: { jiraInstanceId: instance.id },
|
|
228
|
+
});
|
|
229
|
+
const data = runtimeCommandPayloadData(result);
|
|
230
|
+
if (!data) {
|
|
231
|
+
return {
|
|
232
|
+
success: false,
|
|
233
|
+
message: result?.message ?? { text: 'Failed to save Jira connection.' },
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
return { success: true, kind: 'object', data: { outcome: 'connected', connection: data } };
|
|
237
|
+
}
|
|
238
|
+
//#endregion
|
|
239
|
+
//#region ---- Cloud (OAuth2) ----
|
|
240
|
+
async connectCloud(providerId, connectionScope, instance, i18nPrefix) {
|
|
241
|
+
const instructions = await this.translationService.translateAsync('@extensions-jira:integration.auth.oauth.instructions');
|
|
242
|
+
const confirmedResult = await this.layoutBuilder
|
|
243
|
+
.create()
|
|
244
|
+
.dialog((dialog) => {
|
|
245
|
+
dialog
|
|
246
|
+
.setTitle(`${i18nPrefix}.oauth-dialog.title`)
|
|
247
|
+
.setSize('sm')
|
|
248
|
+
.setCloseButton(true)
|
|
249
|
+
.content((flex) => {
|
|
250
|
+
flex
|
|
251
|
+
.setDirection('column')
|
|
252
|
+
.setGap('12px')
|
|
253
|
+
.customWidget('text-block-layout', {
|
|
254
|
+
content: instructions ?? '',
|
|
255
|
+
});
|
|
256
|
+
})
|
|
257
|
+
.setActions((actions) => {
|
|
258
|
+
actions.cancel('@general:actions.cancel.title').submit(`${i18nPrefix}.oauth-dialog.actions.connect`);
|
|
259
|
+
})
|
|
260
|
+
.onAction(async (ref) => ref.action() !== 'cancel');
|
|
261
|
+
})
|
|
262
|
+
.show();
|
|
263
|
+
const confirmed = resolveLayoutBuilderDialogResult(confirmedResult);
|
|
264
|
+
if (!confirmed) {
|
|
265
|
+
return { success: true, kind: 'object', data: { outcome: 'cancelled' } };
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
success: false,
|
|
269
|
+
message: {
|
|
270
|
+
text: '@extensions-jira:integration.auth.oauth.not-implemented',
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
//#endregion
|
|
275
|
+
//#region ---- Dialogs ----
|
|
276
|
+
async openPatDialog(input) {
|
|
277
|
+
const instructions = await this.translationService.translateAsync('@extensions-jira:integration.auth.pat.instructions');
|
|
278
|
+
const result = await this.layoutBuilder
|
|
279
|
+
.create()
|
|
280
|
+
.dialog((dialog) => {
|
|
281
|
+
dialog
|
|
282
|
+
.setTitle(`${input.i18nPrefix}.pat-dialog.title`)
|
|
283
|
+
.setSize('md')
|
|
284
|
+
.setCloseButton(true)
|
|
285
|
+
.setContext({ ...input.context })
|
|
286
|
+
.content((flex) => {
|
|
287
|
+
flex
|
|
288
|
+
.setDirection('column')
|
|
289
|
+
.setGap('12px')
|
|
290
|
+
.customWidget('text-block-layout', { content: instructions ?? '' })
|
|
291
|
+
.formField(`${input.i18nPrefix}.pat-dialog.fields.display-name`, (field) => {
|
|
292
|
+
field.path('displayName');
|
|
293
|
+
field.textBox({ placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.display-name` });
|
|
294
|
+
})
|
|
295
|
+
.formField(`${input.i18nPrefix}.pat-dialog.fields.instance-url`, (field) => {
|
|
296
|
+
field.path('instanceUrl');
|
|
297
|
+
if (input.instanceUrlReadonly) {
|
|
298
|
+
field.readonly(true);
|
|
299
|
+
}
|
|
300
|
+
field.textBox({
|
|
301
|
+
placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.instance-url`,
|
|
302
|
+
});
|
|
303
|
+
})
|
|
304
|
+
.formField(`${input.i18nPrefix}.pat-dialog.fields.token`, (field) => {
|
|
305
|
+
field.path('token');
|
|
306
|
+
field.passwordBox({
|
|
307
|
+
placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.token`,
|
|
308
|
+
revealToggle: true,
|
|
309
|
+
validations: [{ rule: 'required' }],
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
})
|
|
313
|
+
.setActions((actions) => {
|
|
314
|
+
actions
|
|
315
|
+
.cancel('@general:actions.cancel.title')
|
|
316
|
+
.submit(`${input.i18nPrefix}.pat-dialog.actions.save`);
|
|
317
|
+
})
|
|
318
|
+
.onAction(async (ref) => {
|
|
319
|
+
if (ref.action() === 'cancel') {
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
const ctx = ref.context();
|
|
323
|
+
const token = trim(ctx.token);
|
|
324
|
+
if (!token) {
|
|
325
|
+
throw new Error('Personal access token is required.');
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
displayName: trim(ctx.displayName),
|
|
329
|
+
instanceUrl: trim(ctx.instanceUrl),
|
|
330
|
+
token,
|
|
331
|
+
};
|
|
332
|
+
});
|
|
333
|
+
})
|
|
334
|
+
.show();
|
|
335
|
+
return resolveLayoutBuilderDialogResult(result);
|
|
336
|
+
}
|
|
337
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ConnectJiraCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
338
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ConnectJiraCommand, providedIn: 'root' }); }
|
|
339
|
+
}
|
|
340
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ConnectJiraCommand, decorators: [{
|
|
341
|
+
type: Injectable,
|
|
342
|
+
args: [{ providedIn: 'root' }]
|
|
343
|
+
}] });
|
|
344
|
+
|
|
345
|
+
export { ConnectJiraCommand };
|
|
346
|
+
//# sourceMappingURL=acorex-platform-extension-project-management-jira-client-connect-jira.command-DNMUeLqv.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-project-management-jira-client-connect-jira.command-DNMUeLqv.mjs","sources":["../../../../libs/extensions/project-management/jira/client/src/lib/features/connect/ui/jira-instance-picker-popup.component.ts","../../../../libs/extensions/project-management/jira/client/src/lib/features/connect/connect-jira.command.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXSelectionListModule } from '@acorex/components/selection-list';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { resolveMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport type { AXEJiraInstanceEntityModel } from '@acorex-platform/extension-project-management-jira-domain';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXMJiraInstancePickerPopupResult {\n instance: AXEJiraInstanceEntityModel;\n}\n\n//#endregion\n\n//#region ---- Component ----\n\n@Component({\n selector: 'axm-jira-instance-picker-popup',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AsyncPipe, AXButtonModule, AXDecoratorModule, AXSelectionListModule, AXTranslationModule],\n template: `\n <div class=\"flex flex-col gap-2 p-4\">\n @if (instances.length === 0) {\n <p class=\"text-sm opacity-70\">\n {{ '@extensions-jira:integration.connect.instance-picker.empty' | translate | async }}\n </p>\n } @else {\n <ax-selection-list\n class=\"w-full\"\n valueField=\"id\"\n textField=\"title\"\n [direction]=\"'vertical'\"\n [look]=\"'solid'\"\n [multiple]=\"false\"\n [showControl]=\"false\"\n [items]=\"instanceListItems()\"\n [customTemplate]=\"instanceItemTemplate\"\n (onValueChanged)=\"handleInstanceSelection($event)\"\n >\n <ng-template #instanceItemTemplate let-item>\n <div class=\"flex w-full flex-col items-start gap-0.5 py-1\">\n <span class=\"font-medium\">{{ item.data.title }}</span>\n <span class=\"text-xs opacity-70\">{{ item.data.deploymentLabelKey | translate | async }}</span>\n </div>\n </ng-template>\n </ax-selection-list>\n }\n </div>\n <ax-footer>\n <ax-suffix>\n <ax-button\n look=\"outline\"\n [text]=\"'@general:actions.cancel.title' | translate | async\"\n (onClick)=\"close()\"\n ></ax-button>\n </ax-suffix>\n </ax-footer>\n `,\n})\nexport class AXMJiraInstancePickerPopupComponent extends AXBasePageComponent {\n instances: AXEJiraInstanceEntityModel[] = [];\n\n protected instanceListItems(): Array<{\n id: string;\n title: string;\n deploymentLabelKey: string;\n }> {\n return this.instances.map((instance) => ({\n id: instance.id,\n title: this.instanceTitle(instance),\n deploymentLabelKey: this.deploymentLabelKey(instance),\n }));\n }\n\n protected handleInstanceSelection(event: AXValueChangedEvent): void {\n if (!event.isUserInteraction) {\n return;\n }\n\n const instance = this.instances.find((item) => item.id === event.value);\n if (instance) {\n this.selectInstance(instance);\n }\n }\n\n protected instanceTitle(instance: AXEJiraInstanceEntityModel): string {\n return resolveMultiLanguageString(instance.title, 'en-US');\n }\n\n protected deploymentLabelKey(instance: AXEJiraInstanceEntityModel): string {\n return instance.deploymentType === 'cloud'\n ? '@extensions-jira:instances.entities.instance.fields.deployment-type.options.cloud'\n : '@extensions-jira:instances.entities.instance.fields.deployment-type.options.self-hosted';\n }\n\n protected selectInstance(instance: AXEJiraInstanceEntityModel): void {\n this.close({ instance } satisfies AXMJiraInstancePickerPopupResult);\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport {\n AXP_INTEGRATION_AUTH_METHOD_TYPE,\n runtimeCommandPayloadData,\n type AXPIntegrationConnectionScope,\n type AXPRuntimeCommandResult,\n type AXPSafeIntegrationConnectionDto,\n} from '@acorex-platform/framework-shared/core';\nimport {\n type ConnectCommandResult,\n} from '@acorex-platform/module-integration-management-client';\nimport { AXMIntegrationManagementCommandKeys } from '@acorex-platform/module-integration-management-client/contracts';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXPLayoutBuilderService,\n resolveLayoutBuilderDialogResult,\n type AXPDialogRef,\n type IActionBuilder,\n type IDialogBuilder,\n type IFlexContainerBuilder,\n type IFormFieldBuilder,\n} from '@acorex-platform/framework-client/layout/builder';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Injectable, inject } from '@angular/core';\nimport { defaultTo, get, trim } from 'lodash-es';\n\nimport { RootConfig } from '@acorex-platform/extension-project-management-jira-client/contracts';\nimport type { AXEJiraInstanceEntityModel } from '@acorex-platform/extension-project-management-jira-domain';\nimport {\n AXMJiraInstancePickerPopupComponent,\n type AXMJiraInstancePickerPopupResult,\n} from './ui/jira-instance-picker-popup.component';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface ConnectJiraCommandInput {\n providerId?: string;\n connectionScope?: AXPIntegrationConnectionScope;\n}\n\ninterface JiraPatFormContext {\n displayName: string;\n instanceUrl: string;\n token: string;\n}\n\ninterface JiraPatFormResult {\n displayName: string;\n instanceUrl: string;\n token: string;\n}\n\n//#endregion\n\n//#region ---- Command ----\n\n/** Jira connect: pick instance → self-hosted PAT or cloud OAuth2. */\n@Injectable({ providedIn: 'root' })\nexport class ConnectJiraCommand implements AXPCommand<ConnectJiraCommandInput, ConnectCommandResult> {\n //#region ---- Services & Dependencies ----\n\n private readonly popupService = inject(AXPopupService);\n private readonly translationService = inject(AXTranslationService);\n private readonly entityService = inject(AXPEntityService);\n private readonly layoutBuilder = inject(AXPLayoutBuilderService);\n private readonly commandService = inject(AXPCommandService);\n private readonly sessionService = inject(AXPSessionService);\n\n //#endregion\n\n //#region ---- Execute ----\n\n async execute(input: ConnectJiraCommandInput = {}): AXPCommandExecuteResultPromise<ConnectCommandResult> {\n try {\n const providerId = defaultTo(input.providerId, 'jira');\n const connectionScope: AXPIntegrationConnectionScope = input.connectionScope ?? 'tenant';\n const I18N = '@extensions-jira:integration.connect';\n\n const instance = await this.pickInstance();\n if (!instance) {\n return { success: true, kind: 'object', data: { outcome: 'cancelled' } };\n }\n\n if (instance.deploymentType === 'selfHosted') {\n return this.connectSelfHosted(providerId, connectionScope, instance, I18N);\n }\n\n return this.connectCloud(providerId, connectionScope, instance, I18N);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to connect Jira instance.';\n return { success: false, message: { text: message } };\n }\n }\n\n //#endregion\n\n //#region ---- Instance Picker ----\n\n private async pickInstance(): Promise<AXEJiraInstanceEntityModel | null> {\n const instances = await this.loadActiveInstances();\n const title = await this.translationService.translateAsync(\n '@extensions-jira:integration.connect.instance-picker.title',\n );\n\n const result = await this.popupService.open(AXMJiraInstancePickerPopupComponent, {\n title,\n size: 'sm',\n data: { instances },\n });\n\n return (result?.data as AXMJiraInstancePickerPopupResult | undefined)?.instance ?? null;\n }\n\n private async loadActiveInstances(): Promise<AXEJiraInstanceEntityModel[]> {\n const accessor = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.jiraInstance.name)\n .data<string, AXEJiraInstanceEntityModel>();\n\n const result = await accessor.query({\n skip: 0,\n take: 200,\n filter: {\n logic: 'and',\n filters: [{ field: 'isActive', operator: { type: 'equal' }, value: true }],\n },\n });\n\n return result.items ?? [];\n }\n\n //#endregion\n\n //#region ---- Self-Hosted (PAT) ----\n\n private async connectSelfHosted(\n providerId: string,\n connectionScope: AXPIntegrationConnectionScope,\n instance: AXEJiraInstanceEntityModel,\n i18nPrefix: string,\n ): AXPCommandExecuteResultPromise<ConnectCommandResult> {\n const form = await this.openPatDialog({\n i18nPrefix,\n context: {\n displayName: instance.name,\n instanceUrl: defaultTo(instance.baseUrl, ''),\n token: '',\n },\n instanceUrlReadonly: true,\n });\n\n if (!form) {\n return { success: true, kind: 'object', data: { outcome: 'cancelled' } };\n }\n\n const result = await this.commandService.execute<\n Record<string, unknown>,\n AXPSafeIntegrationConnectionDto\n >(AXMIntegrationManagementCommandKeys.ConnectionConnectWithCredentials, {\n providerId,\n authMethodType: AXP_INTEGRATION_AUTH_METHOD_TYPE.Pat,\n connectionScope,\n connectionKey: instance.name,\n displayName: defaultTo(trim(form.displayName), instance.name),\n instanceUrl: defaultTo(trim(form.instanceUrl), defaultTo(instance.baseUrl, '')),\n credentials: { token: form.token },\n config: { jiraInstanceId: instance.id },\n });\n\n const data = runtimeCommandPayloadData(result);\n if (!data) {\n return {\n success: false,\n message: result?.message ?? { text: 'Failed to save Jira connection.' },\n };\n }\n\n return { success: true, kind: 'object', data: { outcome: 'connected', connection: data } };\n }\n\n //#endregion\n\n //#region ---- Cloud (OAuth2) ----\n\n private async connectCloud(\n providerId: string,\n connectionScope: AXPIntegrationConnectionScope,\n instance: AXEJiraInstanceEntityModel,\n i18nPrefix: string,\n ): AXPCommandExecuteResultPromise<ConnectCommandResult> {\n const instructions = await this.translationService.translateAsync(\n '@extensions-jira:integration.auth.oauth.instructions',\n );\n\n const confirmedResult = await this.layoutBuilder\n .create()\n .dialog<boolean>((dialog: IDialogBuilder<boolean>) => {\n dialog\n .setTitle(`${i18nPrefix}.oauth-dialog.title`)\n .setSize('sm')\n .setCloseButton(true)\n .content((flex: IFlexContainerBuilder) => {\n flex\n .setDirection('column')\n .setGap('12px')\n .customWidget('text-block-layout', {\n content: instructions ?? '',\n });\n })\n .setActions((actions: IActionBuilder) => {\n actions.cancel('@general:actions.cancel.title').submit(`${i18nPrefix}.oauth-dialog.actions.connect`);\n })\n .onAction(async (ref: AXPDialogRef) => ref.action() !== 'cancel');\n })\n .show();\n\n const confirmed = resolveLayoutBuilderDialogResult<boolean>(confirmedResult);\n if (!confirmed) {\n return { success: true, kind: 'object', data: { outcome: 'cancelled' } };\n }\n\n return {\n success: false,\n message: {\n text: '@extensions-jira:integration.auth.oauth.not-implemented',\n },\n };\n }\n\n //#endregion\n\n //#region ---- Dialogs ----\n\n private async openPatDialog(input: {\n i18nPrefix: string;\n context: JiraPatFormContext;\n instanceUrlReadonly?: boolean;\n }): Promise<JiraPatFormResult | null> {\n const instructions = await this.translationService.translateAsync(\n '@extensions-jira:integration.auth.pat.instructions',\n );\n\n const result = await this.layoutBuilder\n .create()\n .dialog<JiraPatFormResult | null>((dialog: IDialogBuilder<JiraPatFormResult | null>) => {\n dialog\n .setTitle(`${input.i18nPrefix}.pat-dialog.title`)\n .setSize('md')\n .setCloseButton(true)\n .setContext({ ...input.context })\n .content((flex: IFlexContainerBuilder) => {\n flex\n .setDirection('column')\n .setGap('12px')\n .customWidget('text-block-layout', { content: instructions ?? '' })\n .formField(`${input.i18nPrefix}.pat-dialog.fields.display-name`, (field: IFormFieldBuilder) => {\n field.path('displayName');\n field.textBox({ placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.display-name` });\n })\n .formField(`${input.i18nPrefix}.pat-dialog.fields.instance-url`, (field) => {\n field.path('instanceUrl');\n if (input.instanceUrlReadonly) {\n field.readonly(true);\n }\n field.textBox({\n placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.instance-url`,\n });\n })\n .formField(`${input.i18nPrefix}.pat-dialog.fields.token`, (field) => {\n field.path('token');\n field.passwordBox({\n placeholder: `${input.i18nPrefix}.pat-dialog.placeholders.token`,\n revealToggle: true,\n validations: [{ rule: 'required' }],\n });\n });\n })\n .setActions((actions: IActionBuilder) => {\n actions\n .cancel('@general:actions.cancel.title')\n .submit(`${input.i18nPrefix}.pat-dialog.actions.save`);\n })\n .onAction(async (ref: AXPDialogRef) => {\n if (ref.action() === 'cancel') {\n return null;\n }\n const ctx = ref.context() as JiraPatFormContext;\n const token = trim(ctx.token);\n if (!token) {\n throw new Error('Personal access token is required.');\n }\n return {\n displayName: trim(ctx.displayName),\n instanceUrl: trim(ctx.instanceUrl),\n token,\n };\n });\n })\n .show();\n\n return resolveLayoutBuilderDialogResult<JiraPatFormResult>(result);\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":["i2","i4"],"mappings":"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"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
export { AXE_PM_PROJECT_SYNC_STRATEGIES as AXE_JIRA_PROJECT_SYNC_STRATEGIES } from '@acorex-platform/extension-project-management-core-contracts';
|
|
2
|
+
|
|
3
|
+
//#region ---- Module Config ----
|
|
4
|
+
const config = {
|
|
5
|
+
i18n: 'extensions-jira',
|
|
6
|
+
};
|
|
7
|
+
/** Logical module name (PascalCase) — matches entity-storage API naming (`JiraExtension.JiraInstance`). */
|
|
8
|
+
const MODULE_NAME = 'JiraExtension';
|
|
9
|
+
const RootConfig = {
|
|
10
|
+
config,
|
|
11
|
+
module: {
|
|
12
|
+
name: MODULE_NAME,
|
|
13
|
+
title: `@${config.i18n}:integration.display-name`,
|
|
14
|
+
icon: 'fa-brands fa-jira',
|
|
15
|
+
},
|
|
16
|
+
entities: {
|
|
17
|
+
jiraInstance: {
|
|
18
|
+
name: 'JiraInstance',
|
|
19
|
+
fullName: `${MODULE_NAME}.JiraInstance`,
|
|
20
|
+
title: `@${config.i18n}:instances.entities.instance.title`,
|
|
21
|
+
titlePlural: `@${config.i18n}:instances.entities.instance.plural`,
|
|
22
|
+
icon: 'fa-light fa-server',
|
|
23
|
+
},
|
|
24
|
+
jiraProject: {
|
|
25
|
+
name: 'JiraProject',
|
|
26
|
+
fullName: `${MODULE_NAME}.JiraProject`,
|
|
27
|
+
title: `@${config.i18n}:project-links.entities.project-link.title`,
|
|
28
|
+
titlePlural: `@${config.i18n}:project-links.entities.project-link.plural`,
|
|
29
|
+
icon: 'fa-light fa-link',
|
|
30
|
+
},
|
|
31
|
+
jiraIssueType: {
|
|
32
|
+
name: 'JiraIssueType',
|
|
33
|
+
fullName: `${MODULE_NAME}.JiraIssueType`,
|
|
34
|
+
title: `@${config.i18n}:issue-types.entities.issue-type.title`,
|
|
35
|
+
titlePlural: `@${config.i18n}:issue-types.entities.issue-type.plural`,
|
|
36
|
+
icon: 'fa-light fa-list-tree',
|
|
37
|
+
},
|
|
38
|
+
jiraField: {
|
|
39
|
+
name: 'JiraField',
|
|
40
|
+
fullName: `${MODULE_NAME}.JiraField`,
|
|
41
|
+
title: `@${config.i18n}:fields.entities.field.title`,
|
|
42
|
+
titlePlural: `@${config.i18n}:fields.entities.field.plural`,
|
|
43
|
+
icon: 'fa-light fa-input-text',
|
|
44
|
+
},
|
|
45
|
+
jiraProjectIssueType: {
|
|
46
|
+
name: 'JiraProjectIssueType',
|
|
47
|
+
fullName: `${MODULE_NAME}.JiraProjectIssueType`,
|
|
48
|
+
title: `@${config.i18n}:project-issue-types.entities.project-issue-type.title`,
|
|
49
|
+
titlePlural: `@${config.i18n}:project-issue-types.entities.project-issue-type.plural`,
|
|
50
|
+
icon: 'fa-light fa-link',
|
|
51
|
+
},
|
|
52
|
+
jiraProjectIssueTypeField: {
|
|
53
|
+
name: 'JiraProjectIssueTypeField',
|
|
54
|
+
fullName: `${MODULE_NAME}.JiraProjectIssueTypeField`,
|
|
55
|
+
title: `@${config.i18n}:project-issue-type-fields.entities.project-issue-type-field.title`,
|
|
56
|
+
titlePlural: `@${config.i18n}:project-issue-type-fields.entities.project-issue-type-field.plural`,
|
|
57
|
+
icon: 'fa-light fa-table-columns',
|
|
58
|
+
},
|
|
59
|
+
jiraWorkflowStatus: {
|
|
60
|
+
name: 'JiraWorkflowStatus',
|
|
61
|
+
fullName: `${MODULE_NAME}.JiraWorkflowStatus`,
|
|
62
|
+
title: `@${config.i18n}:workflow-statuses.entities.workflow-status.title`,
|
|
63
|
+
titlePlural: `@${config.i18n}:workflow-statuses.entities.workflow-status.plural`,
|
|
64
|
+
icon: 'fa-light fa-circle-dot',
|
|
65
|
+
},
|
|
66
|
+
jiraIssue: {
|
|
67
|
+
name: 'JiraIssue',
|
|
68
|
+
fullName: `${MODULE_NAME}.JiraIssue`,
|
|
69
|
+
title: `@${config.i18n}:issues.entities.issue.title`,
|
|
70
|
+
titlePlural: `@${config.i18n}:issues.entities.issue.plural`,
|
|
71
|
+
icon: 'fa-light fa-ticket',
|
|
72
|
+
},
|
|
73
|
+
jiraWorklog: {
|
|
74
|
+
name: 'JiraWorklog',
|
|
75
|
+
fullName: `${MODULE_NAME}.JiraWorklog`,
|
|
76
|
+
title: `@${config.i18n}:worklogs.entities.worklog.title`,
|
|
77
|
+
titlePlural: `@${config.i18n}:worklogs.entities.worklog.plural`,
|
|
78
|
+
icon: 'fa-light fa-clock',
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
//#endregion
|
|
83
|
+
|
|
84
|
+
//#region ---- Command Keys ----
|
|
85
|
+
const AXEJiraCommandKeys = {
|
|
86
|
+
ConnectionConnect: 'jira-extension.Connection:Connect',
|
|
87
|
+
ProjectImportFromJira: 'jira-extension.Project:ImportFromJira',
|
|
88
|
+
ProjectSync: 'jira-extension.Project:Sync',
|
|
89
|
+
};
|
|
90
|
+
//#endregion
|
|
91
|
+
|
|
92
|
+
//#region ---- Query Keys ----
|
|
93
|
+
const AXEJiraQueryKeys = {
|
|
94
|
+
ProjectListRemote: 'jira-extension.Project:ListRemote',
|
|
95
|
+
};
|
|
96
|
+
//#endregion
|
|
97
|
+
|
|
98
|
+
//#region ---- Menu Keys ----
|
|
99
|
+
const AXEJiraMenuKeys = {
|
|
100
|
+
JiraExtensionConfig: 'jira-extension:Menu:Configuration',
|
|
101
|
+
Instances: 'jira-extension:Menu:Instances',
|
|
102
|
+
IssueTypes: 'jira-extension:Menu:IssueTypes',
|
|
103
|
+
Fields: 'jira-extension:Menu:Fields',
|
|
104
|
+
Issues: 'jira-extension:Menu:Issues',
|
|
105
|
+
Worklogs: 'jira-extension:Menu:Worklogs',
|
|
106
|
+
};
|
|
107
|
+
//#endregion
|
|
108
|
+
|
|
109
|
+
//#region ---- Permission Keys ----
|
|
110
|
+
/**
|
|
111
|
+
* Administration capabilities used by this extension.
|
|
112
|
+
* Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).
|
|
113
|
+
*/
|
|
114
|
+
const AXPAdministrationPermissionKeys = {
|
|
115
|
+
Access: 'Administration:Permission:Access',
|
|
116
|
+
MaintainUsersAndRoles: 'Administration:Permission:MaintainUsersAndRoles',
|
|
117
|
+
ManageSessions: 'Administration:Permission:ManageSessions',
|
|
118
|
+
MaintainPolicies: 'Administration:Permission:MaintainPolicies',
|
|
119
|
+
ViewIntegrations: 'Administration:Permission:ViewIntegrations',
|
|
120
|
+
MaintainConnections: 'Administration:Permission:MaintainConnections',
|
|
121
|
+
ManageIntegrationActions: 'Administration:Permission:ManageIntegrationActions',
|
|
122
|
+
MaintainWorkflows: 'Administration:Permission:MaintainWorkflows',
|
|
123
|
+
ManageWorkflowActions: 'Administration:Permission:ManageWorkflowActions',
|
|
124
|
+
ViewRules: 'Administration:Permission:ViewRules',
|
|
125
|
+
MaintainRules: 'Administration:Permission:MaintainRules',
|
|
126
|
+
ManageRuleActions: 'Administration:Permission:ManageRuleActions',
|
|
127
|
+
MaintainAi: 'Administration:Permission:MaintainAi',
|
|
128
|
+
UseAiAssist: 'Administration:Permission:UseAiAssist',
|
|
129
|
+
MaintainDashboards: 'Administration:Permission:MaintainDashboards',
|
|
130
|
+
ViewJobs: 'Administration:Permission:ViewJobs',
|
|
131
|
+
ManageJobActions: 'Administration:Permission:ManageJobActions',
|
|
132
|
+
ViewObservability: 'Administration:Permission:ViewObservability',
|
|
133
|
+
MaintainObservability: 'Administration:Permission:MaintainObservability',
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* @deprecated Prefer {@link AXPAdministrationPermissionKeys}.
|
|
137
|
+
* Legacy nested shape kept so existing imports compile during migration.
|
|
138
|
+
*/
|
|
139
|
+
const AXEJiraPermissions = {
|
|
140
|
+
JiraExtension: {
|
|
141
|
+
Management: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
142
|
+
JiraInstance: {
|
|
143
|
+
View: AXPAdministrationPermissionKeys.ViewIntegrations,
|
|
144
|
+
Create: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
145
|
+
Update: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
146
|
+
Delete: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
147
|
+
},
|
|
148
|
+
JiraProject: {
|
|
149
|
+
View: AXPAdministrationPermissionKeys.ViewIntegrations,
|
|
150
|
+
Create: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
151
|
+
Update: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
152
|
+
Delete: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
153
|
+
},
|
|
154
|
+
JiraIssue: {
|
|
155
|
+
View: AXPAdministrationPermissionKeys.ViewIntegrations,
|
|
156
|
+
Create: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
157
|
+
Update: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
158
|
+
Delete: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
159
|
+
},
|
|
160
|
+
JiraWorklog: {
|
|
161
|
+
View: AXPAdministrationPermissionKeys.ViewIntegrations,
|
|
162
|
+
Create: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
163
|
+
Update: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
164
|
+
Delete: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
165
|
+
},
|
|
166
|
+
Catalog: {
|
|
167
|
+
View: AXPAdministrationPermissionKeys.ViewIntegrations,
|
|
168
|
+
Manage: AXPAdministrationPermissionKeys.MaintainConnections,
|
|
169
|
+
},
|
|
170
|
+
ProjectImport: {
|
|
171
|
+
Execute: AXPAdministrationPermissionKeys.ManageIntegrationActions,
|
|
172
|
+
},
|
|
173
|
+
ProjectSync: {
|
|
174
|
+
Execute: AXPAdministrationPermissionKeys.ManageIntegrationActions,
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
//#endregion
|
|
179
|
+
|
|
180
|
+
//#region ---- Remote Jira project DTO ----
|
|
181
|
+
//#endregion
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Generated bundle index. Do not edit.
|
|
185
|
+
*/
|
|
186
|
+
|
|
187
|
+
export { AXEJiraCommandKeys, AXEJiraMenuKeys, AXEJiraPermissions, AXEJiraQueryKeys, AXPAdministrationPermissionKeys, RootConfig };
|
|
188
|
+
//# sourceMappingURL=acorex-platform-extension-project-management-jira-client-contracts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-extension-project-management-jira-client-contracts.mjs","sources":["../../../../libs/extensions/project-management/jira/contracts/src/root-config.ts","../../../../libs/extensions/project-management/jira/contracts/src/commands.keys.ts","../../../../libs/extensions/project-management/jira/contracts/src/queries.keys.ts","../../../../libs/extensions/project-management/jira/contracts/src/menu.keys.ts","../../../../libs/extensions/project-management/jira/contracts/src/permission.keys.ts","../../../../libs/extensions/project-management/jira/contracts/src/project-sync.api.types.ts","../../../../libs/extensions/project-management/jira/contracts/src/acorex-platform-extension-project-management-jira-client-contracts.ts"],"sourcesContent":["//#region ---- Module Config ----\n\nconst config = {\n i18n: 'extensions-jira',\n};\n\n/** Logical module name (PascalCase) — matches entity-storage API naming (`JiraExtension.JiraInstance`). */\nconst MODULE_NAME = 'JiraExtension';\n\nexport const RootConfig = {\n config,\n module: {\n name: MODULE_NAME,\n title: `@${config.i18n}:integration.display-name`,\n icon: 'fa-brands fa-jira',\n },\n entities: {\n jiraInstance: {\n name: 'JiraInstance',\n fullName: `${MODULE_NAME}.JiraInstance`,\n title: `@${config.i18n}:instances.entities.instance.title`,\n titlePlural: `@${config.i18n}:instances.entities.instance.plural`,\n icon: 'fa-light fa-server',\n },\n jiraProject: {\n name: 'JiraProject',\n fullName: `${MODULE_NAME}.JiraProject`,\n title: `@${config.i18n}:project-links.entities.project-link.title`,\n titlePlural: `@${config.i18n}:project-links.entities.project-link.plural`,\n icon: 'fa-light fa-link',\n },\n jiraIssueType: {\n name: 'JiraIssueType',\n fullName: `${MODULE_NAME}.JiraIssueType`,\n title: `@${config.i18n}:issue-types.entities.issue-type.title`,\n titlePlural: `@${config.i18n}:issue-types.entities.issue-type.plural`,\n icon: 'fa-light fa-list-tree',\n },\n jiraField: {\n name: 'JiraField',\n fullName: `${MODULE_NAME}.JiraField`,\n title: `@${config.i18n}:fields.entities.field.title`,\n titlePlural: `@${config.i18n}:fields.entities.field.plural`,\n icon: 'fa-light fa-input-text',\n },\n jiraProjectIssueType: {\n name: 'JiraProjectIssueType',\n fullName: `${MODULE_NAME}.JiraProjectIssueType`,\n title: `@${config.i18n}:project-issue-types.entities.project-issue-type.title`,\n titlePlural: `@${config.i18n}:project-issue-types.entities.project-issue-type.plural`,\n icon: 'fa-light fa-link',\n },\n jiraProjectIssueTypeField: {\n name: 'JiraProjectIssueTypeField',\n fullName: `${MODULE_NAME}.JiraProjectIssueTypeField`,\n title: `@${config.i18n}:project-issue-type-fields.entities.project-issue-type-field.title`,\n titlePlural: `@${config.i18n}:project-issue-type-fields.entities.project-issue-type-field.plural`,\n icon: 'fa-light fa-table-columns',\n },\n jiraWorkflowStatus: {\n name: 'JiraWorkflowStatus',\n fullName: `${MODULE_NAME}.JiraWorkflowStatus`,\n title: `@${config.i18n}:workflow-statuses.entities.workflow-status.title`,\n titlePlural: `@${config.i18n}:workflow-statuses.entities.workflow-status.plural`,\n icon: 'fa-light fa-circle-dot',\n },\n jiraIssue: {\n name: 'JiraIssue',\n fullName: `${MODULE_NAME}.JiraIssue`,\n title: `@${config.i18n}:issues.entities.issue.title`,\n titlePlural: `@${config.i18n}:issues.entities.issue.plural`,\n icon: 'fa-light fa-ticket',\n },\n jiraWorklog: {\n name: 'JiraWorklog',\n fullName: `${MODULE_NAME}.JiraWorklog`,\n title: `@${config.i18n}:worklogs.entities.worklog.title`,\n titlePlural: `@${config.i18n}:worklogs.entities.worklog.plural`,\n icon: 'fa-light fa-clock',\n },\n },\n};\n\n//#endregion\n","//#region ---- Command Keys ----\n\nexport const AXEJiraCommandKeys = {\n ConnectionConnect: 'jira-extension.Connection:Connect',\n ProjectImportFromJira: 'jira-extension.Project:ImportFromJira',\n ProjectSync: 'jira-extension.Project:Sync',\n} as const;\n\n//#endregion\n","//#region ---- Query Keys ----\n\nexport const AXEJiraQueryKeys = {\n ProjectListRemote: 'jira-extension.Project:ListRemote',\n} as const;\n\n//#endregion\n","//#region ---- Menu Keys ----\n\nexport const AXEJiraMenuKeys = {\n JiraExtensionConfig: 'jira-extension:Menu:Configuration',\n Instances: 'jira-extension:Menu:Instances',\n IssueTypes: 'jira-extension:Menu:IssueTypes',\n Fields: 'jira-extension:Menu:Fields',\n Issues: 'jira-extension:Menu:Issues',\n Worklogs: 'jira-extension:Menu:Worklogs',\n} as const;\n\n//#endregion\n","//#region ---- Permission Keys ----\n\n/**\n * Administration capabilities used by this extension.\n * Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).\n */\nexport const AXPAdministrationPermissionKeys = {\n Access: 'Administration:Permission:Access',\n MaintainUsersAndRoles: 'Administration:Permission:MaintainUsersAndRoles',\n ManageSessions: 'Administration:Permission:ManageSessions',\n MaintainPolicies: 'Administration:Permission:MaintainPolicies',\n ViewIntegrations: 'Administration:Permission:ViewIntegrations',\n MaintainConnections: 'Administration:Permission:MaintainConnections',\n ManageIntegrationActions: 'Administration:Permission:ManageIntegrationActions',\n MaintainWorkflows: 'Administration:Permission:MaintainWorkflows',\n ManageWorkflowActions: 'Administration:Permission:ManageWorkflowActions',\n ViewRules: 'Administration:Permission:ViewRules',\n MaintainRules: 'Administration:Permission:MaintainRules',\n ManageRuleActions: 'Administration:Permission:ManageRuleActions',\n MaintainAi: 'Administration:Permission:MaintainAi',\n UseAiAssist: 'Administration:Permission:UseAiAssist',\n MaintainDashboards: 'Administration:Permission:MaintainDashboards',\n ViewJobs: 'Administration:Permission:ViewJobs',\n ManageJobActions: 'Administration:Permission:ManageJobActions',\n ViewObservability: 'Administration:Permission:ViewObservability',\n MaintainObservability: 'Administration:Permission:MaintainObservability',\n} as const;\n\n/**\n * @deprecated Prefer {@link AXPAdministrationPermissionKeys}.\n * Legacy nested shape kept so existing imports compile during migration.\n */\nexport const AXEJiraPermissions = {\n JiraExtension: {\n Management: AXPAdministrationPermissionKeys.MaintainConnections,\n JiraInstance: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Create: AXPAdministrationPermissionKeys.MaintainConnections,\n Update: AXPAdministrationPermissionKeys.MaintainConnections,\n Delete: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n JiraProject: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Create: AXPAdministrationPermissionKeys.MaintainConnections,\n Update: AXPAdministrationPermissionKeys.MaintainConnections,\n Delete: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n JiraIssue: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Create: AXPAdministrationPermissionKeys.MaintainConnections,\n Update: AXPAdministrationPermissionKeys.MaintainConnections,\n Delete: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n JiraWorklog: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Create: AXPAdministrationPermissionKeys.MaintainConnections,\n Update: AXPAdministrationPermissionKeys.MaintainConnections,\n Delete: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n Catalog: {\n View: AXPAdministrationPermissionKeys.ViewIntegrations,\n Manage: AXPAdministrationPermissionKeys.MaintainConnections,\n },\n ProjectImport: {\n Execute: AXPAdministrationPermissionKeys.ManageIntegrationActions,\n },\n ProjectSync: {\n Execute: AXPAdministrationPermissionKeys.ManageIntegrationActions,\n },\n },\n} as const;\n\n//#endregion\n","//#region ---- Remote Jira project DTO ----\n\nimport type { AXEJiraProjectSyncStrategy } from './sync.types';\n\n/** Subset of Jira REST API project resource used for import/sync. */\nexport interface AXEJiraRemoteProject {\n id: string;\n key: string;\n name: string;\n description?: string | null;\n projectTypeKey?: string | null;\n style?: string | null;\n simplified?: boolean | null;\n lead?: {\n accountId?: string;\n displayName?: string;\n } | null;\n avatarUrls?: Record<string, string> | null;\n}\n\nexport type AXEJiraProjectImportStatus = 'imported' | 'not_imported';\n\nexport interface AXEJiraRemoteProjectListItem extends AXEJiraRemoteProject {\n importStatus: AXEJiraProjectImportStatus;\n platformProjectId?: string | null;\n}\n\n//#endregion\n\n//#region ---- API request / response ----\n\nexport interface AXEJiraListRemoteProjectsRequest {\n instanceId?: string;\n}\n\nexport interface AXEJiraListRemoteProjectsResponse {\n instanceId: string;\n projects: AXEJiraRemoteProjectListItem[];\n}\n\nexport interface AXEJiraProjectImportRowInput {\n remote: AXEJiraRemoteProject;\n selected: boolean;\n syncStrategy: AXEJiraProjectSyncStrategy;\n existingPlatformProjectId?: string | null;\n}\n\nexport interface AXEJiraImportProjectsRequest {\n instanceId?: string;\n defaultProjectTypeId: string;\n rows: AXEJiraProjectImportRowInput[];\n}\n\nexport interface AXEJiraProjectImportResult {\n imported: number;\n updated: number;\n skipped: number;\n issuesImported?: number;\n issuesUpdated?: number;\n issuesRemoved?: number;\n worklogsImported?: number;\n worklogsUpdated?: number;\n}\n\nexport interface AXEJiraSyncPlatformProjectRequest {\n platformProjectId: string;\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|