@yuuvis/app-inbox 0.9.13 → 0.10.13
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/extensions/lib/assets/i18n/de.json +6 -4
- package/extensions/lib/assets/i18n/en.json +6 -4
- package/fesm2022/yuuvis-app-inbox-extensions.mjs +9 -5
- package/fesm2022/yuuvis-app-inbox-extensions.mjs.map +1 -1
- package/fesm2022/yuuvis-app-inbox-shared.mjs.map +1 -1
- package/fesm2022/yuuvis-app-inbox.mjs +7 -6
- package/fesm2022/yuuvis-app-inbox.mjs.map +1 -1
- package/lib/assets/i18n/de.json +5 -3
- package/lib/assets/i18n/en.json +4 -2
- package/package.json +1 -1
- package/shared/inbox.interface.d.ts +1 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"io.yuuvis.app.inbox.action.start-process.label": "
|
|
3
|
-
"io.yuuvis.app.inbox.action.start-process.description": "Startet einen
|
|
2
|
+
"io.yuuvis.app.inbox.action.start-process.label": "Prozess starten",
|
|
3
|
+
"io.yuuvis.app.inbox.action.start-process.description": "Startet einen Prozess",
|
|
4
4
|
"io.yuuvis.app.inbox.actions.startProcess.button.start": "Starten",
|
|
5
|
-
"io.yuuvis.app.inbox.actions.startProcess.button.cancel": "Abbrechen"
|
|
6
|
-
}
|
|
5
|
+
"io.yuuvis.app.inbox.actions.startProcess.button.cancel": "Abbrechen",
|
|
6
|
+
"io.yuuvis.app.inbox.actions.startProcess.success": "Prozess \"{{processName}}\" wurde gestartet.",
|
|
7
|
+
"io.yuuvis.app.inbox.actions.startProcess.error": "Der Prozess \"{{processName}}\" konnte nicht gestartet werden."
|
|
8
|
+
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"io.yuuvis.app.inbox.action.start-process.label": "Start
|
|
3
|
-
"io.yuuvis.app.inbox.action.start-process.description": "Starts a
|
|
2
|
+
"io.yuuvis.app.inbox.action.start-process.label": "Start process",
|
|
3
|
+
"io.yuuvis.app.inbox.action.start-process.description": "Starts a process.",
|
|
4
4
|
"io.yuuvis.app.inbox.actions.startProcess.button.start": "Start",
|
|
5
|
-
"io.yuuvis.app.inbox.actions.startProcess.button.cancel": "Cancel"
|
|
6
|
-
}
|
|
5
|
+
"io.yuuvis.app.inbox.actions.startProcess.button.cancel": "Cancel",
|
|
6
|
+
"io.yuuvis.app.inbox.actions.startProcess.success": "Process \"{{processName}}\" has been started.",
|
|
7
|
+
"io.yuuvis.app.inbox.actions.startProcess.error": "Process \"{{processName}}\" could not be started."
|
|
8
|
+
}
|
|
@@ -13,7 +13,7 @@ import { MatIconModule } from '@angular/material/icon';
|
|
|
13
13
|
import { MatProgressBar } from '@angular/material/progress-bar';
|
|
14
14
|
import { AppInboxUtils } from '@yuuvis/app-inbox/shared';
|
|
15
15
|
import * as i4 from '@yuuvis/client-core';
|
|
16
|
-
import { BackendService, TranslateService, SystemService, UserService, ApiBase, TranslateModule } from '@yuuvis/client-core';
|
|
16
|
+
import { BackendService, TranslateService, SystemService, UserService, NotificationService, ApiBase, TranslateModule } from '@yuuvis/client-core';
|
|
17
17
|
import { DialogComponent } from '@yuuvis/client-framework/common';
|
|
18
18
|
import { ListComponent, ListItemDirective } from '@yuuvis/client-framework/list';
|
|
19
19
|
import { ObjectFormComponent } from '@yuuvis/client-framework/object-form';
|
|
@@ -24,6 +24,7 @@ class StartProcessComponent {
|
|
|
24
24
|
translate = inject(TranslateService);
|
|
25
25
|
system = inject(SystemService);
|
|
26
26
|
#userService = inject(UserService);
|
|
27
|
+
#notificationService = inject(NotificationService);
|
|
27
28
|
#dialogData = inject(MAT_DIALOG_DATA);
|
|
28
29
|
#dialogRef = inject((MatDialogRef));
|
|
29
30
|
startForm = viewChild(ObjectFormComponent);
|
|
@@ -67,10 +68,11 @@ class StartProcessComponent {
|
|
|
67
68
|
const variables = Object.keys(formData).map((key) => AppInboxUtils.getProcessVariables(formData[key], formElements[key], key));
|
|
68
69
|
const o = this.object();
|
|
69
70
|
const attachments = o?.id ? [o.id] : [];
|
|
71
|
+
const subject = variables.find(variable => variable.name === 'title')?.value;
|
|
70
72
|
const payload = {
|
|
71
73
|
processDefinitionKey: process.key,
|
|
72
74
|
variables,
|
|
73
|
-
name: this.
|
|
75
|
+
name: subject || this.system.getLocalizedLabel(process.name) || process.name,
|
|
74
76
|
attachments,
|
|
75
77
|
};
|
|
76
78
|
this.busy.set(true);
|
|
@@ -79,9 +81,11 @@ class StartProcessComponent {
|
|
|
79
81
|
.subscribe({
|
|
80
82
|
next: (res) => {
|
|
81
83
|
this.#dialogRef.close(res);
|
|
84
|
+
this.#notificationService.success(this.translate.instant('io.yuuvis.app.inbox.actions.startProcess.success', { processName: payload.name }));
|
|
82
85
|
},
|
|
83
86
|
error: (err) => {
|
|
84
87
|
console.error('Error starting process:', err);
|
|
88
|
+
this.#notificationService.error(this.translate.instant('io.yuuvis.app.inbox.actions.startProcess.error', { processName: payload.name }));
|
|
85
89
|
},
|
|
86
90
|
});
|
|
87
91
|
}
|
|
@@ -121,7 +125,7 @@ class StartProcessComponent {
|
|
|
121
125
|
ngOnInit() {
|
|
122
126
|
this.#getAllProcessDefinitions()
|
|
123
127
|
.pipe(tap((processDefinitions) => {
|
|
124
|
-
processDefinitions = Array.from(processDefinitions
|
|
128
|
+
processDefinitions = Array.from(processDefinitions.filter(pD => !pD.suspended)
|
|
125
129
|
// Remove duplicates by key, keeping only the one with the highest version
|
|
126
130
|
.reduce((acc, cur) => {
|
|
127
131
|
const prev = acc.get(cur.key);
|
|
@@ -136,7 +140,7 @@ class StartProcessComponent {
|
|
|
136
140
|
.subscribe();
|
|
137
141
|
}
|
|
138
142
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: StartProcessComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
139
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: StartProcessComponent, isStandalone: true, selector: "ymi-start-process", inputs: { object: { classPropertyName: "object", publicName: "object", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "startForm", first: true, predicate: ObjectFormComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@let sfo = startFormOptions();\n\n<yuv-dialog\n [headertitel]=\"'io.yuuvis.app.inbox.action.start-process.label' | translate\"\n>\n <!-- eader>\n <h2>{{ selectedProcess()?.name }}</h2>\n } @else {\n <h2>{{ \"io.yuuvis.app.inbox.action.start-process.label\" | translate }}</h2>\n }\n </header> -->\n\n <main>\n @if(sfo) {\n <div class=\"header\">\n <button\n mat-icon-button\n [disabled]=\"busy()\"\n (click)=\"resetSelectedProcess()\"\n >\n <mat-icon>arrow_back</mat-icon>\n </button>\n <h3>\n {{\n system.getLocalizedLabel(selectedProcess()?.
|
|
143
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: StartProcessComponent, isStandalone: true, selector: "ymi-start-process", inputs: { object: { classPropertyName: "object", publicName: "object", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "startForm", first: true, predicate: ObjectFormComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@let sfo = startFormOptions();\n\n<yuv-dialog\n [headertitel]=\"'io.yuuvis.app.inbox.action.start-process.label' | translate\"\n>\n <!-- eader>\n <h2>{{ selectedProcess()?.name }}</h2>\n } @else {\n <h2>{{ \"io.yuuvis.app.inbox.action.start-process.label\" | translate }}</h2>\n }\n </header> -->\n\n <main>\n @if(sfo) {\n <div class=\"header\">\n <button\n mat-icon-button\n [disabled]=\"busy()\"\n (click)=\"resetSelectedProcess()\"\n >\n <mat-icon>arrow_back</mat-icon>\n </button>\n <h3>\n {{\n system.getLocalizedLabel(selectedProcess()?.key!) || selectedProcess()?.key ||\n (\"io.yuuvis.app.inbox.action.start-process.label\" | translate)\n }}\n </h3>\n </div>\n }\n\n <mat-progress-bar\n mode=\"indeterminate\"\n [ngClass]=\"{ busy: busy() }\"\n ></mat-progress-bar>\n\n @if(sfo) {\n <!-- start form of the selected process -->\n <div class=\"form\">\n <yuv-object-form\n #startForm\n [formOptions]=\"sfo\"\n (statusChanged)=\"onFormStatusChanged($event)\"\n ></yuv-object-form>\n </div>\n } @else {\n <!-- list of all available processes -->\n <yuv-list (itemSelect)=\"itemSelected($event)\" selectOnEnter=\"true\">\n @for(process of processDefinitions(); track process.id){\n <div yuvListItem>\n {{ system.getLocalizedLabel(process.key) || process.key }}\n <span class=\"desc\">{{ system.getLocalizedDescription(process.key) || process.description }}</span>\n </div>\n }\n </yuv-list>\n }\n </main>\n\n <footer>\n <button\n ymtButton=\"secondary\"\n type=\"button\"\n (click)=\"close()\"\n [disabled]=\"busy()\"\n >\n {{ \"io.yuuvis.app.inbox.actions.startProcess.button.cancel\" | translate }}\n </button>\n\n @if(sfo) {\n <button\n ymtButton=\"primary\"\n [disabled]=\"disableControls() || busy()\"\n (click)=\"startProcess(startForm())\"\n >\n {{ \"io.yuuvis.app.inbox.actions.startProcess.button.start\" | translate }}\n </button>\n }\n\n <!-- <button class=\"secondary\" [disabled]=\"busy()\" (click)=\"overlayRef.close()\">\n {{\n \"io.yuuvis.app.inbox.actions.startProcess.button.cancel\" | translate\n }}</button -->\n <!-- >} -->\n </footer>\n</yuv-dialog>\n", styles: [":host{display:flex;flex-flow:column;height:100%}:host main{flex:1;overflow:hidden;min-height:200px}:host main mat-progress-bar{position:absolute;z-index:1;opacity:0}:host main mat-progress-bar.busy{opacity:1}:host main .header{flex:0 0 auto;display:flex;align-items:center;padding:var(--ymt-spacing-xs);gap:var(--ymt-spacing-m);border-block-end:1px solid var(--ymt-outline-variant)}:host main .header h3{margin:0}:host main .form{padding:var(--ymt-spacing-xs);flex:1;overflow-y:auto}:host [yuvListItem]{--list-item-hover-background: var(--ymt-focus-background);padding:var(--ymt-spacing-m);border-block-end:1px solid var(--ymt-outline-variant);font:var(--ymt-font-title-small);cursor:pointer}:host [yuvListItem] span.desc:not(:empty){display:block;max-width:66ch;line-height:1.7em;font:var(--ymt-font-body-subtle);color:var(--ymt-text-color-subtle)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ObjectFormComponent, selector: "yuv-object-form", inputs: ["formOptions", "inert", "elementExtensions", "isInnerTableForm"], outputs: ["statusChanged", "onFormReady"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: ListComponent, selector: "yuv-list", inputs: ["multiselect", "selfHandleSelection", "autoSelect", "disableSelection"], outputs: ["itemSelect", "itemFocus"] }, { kind: "directive", type: ListItemDirective, selector: "[yuvListItem]", inputs: ["disabled", "active", "selected"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "component", type: DialogComponent, selector: "yuv-dialog", inputs: ["headertitel"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }] });
|
|
140
144
|
}
|
|
141
145
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: StartProcessComponent, decorators: [{
|
|
142
146
|
type: Component,
|
|
@@ -151,7 +155,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
151
155
|
DialogComponent,
|
|
152
156
|
YmtButtonDirective,
|
|
153
157
|
MatProgressBar,
|
|
154
|
-
], template: "@let sfo = startFormOptions();\n\n<yuv-dialog\n [headertitel]=\"'io.yuuvis.app.inbox.action.start-process.label' | translate\"\n>\n <!-- eader>\n <h2>{{ selectedProcess()?.name }}</h2>\n } @else {\n <h2>{{ \"io.yuuvis.app.inbox.action.start-process.label\" | translate }}</h2>\n }\n </header> -->\n\n <main>\n @if(sfo) {\n <div class=\"header\">\n <button\n mat-icon-button\n [disabled]=\"busy()\"\n (click)=\"resetSelectedProcess()\"\n >\n <mat-icon>arrow_back</mat-icon>\n </button>\n <h3>\n {{\n system.getLocalizedLabel(selectedProcess()?.
|
|
158
|
+
], template: "@let sfo = startFormOptions();\n\n<yuv-dialog\n [headertitel]=\"'io.yuuvis.app.inbox.action.start-process.label' | translate\"\n>\n <!-- eader>\n <h2>{{ selectedProcess()?.name }}</h2>\n } @else {\n <h2>{{ \"io.yuuvis.app.inbox.action.start-process.label\" | translate }}</h2>\n }\n </header> -->\n\n <main>\n @if(sfo) {\n <div class=\"header\">\n <button\n mat-icon-button\n [disabled]=\"busy()\"\n (click)=\"resetSelectedProcess()\"\n >\n <mat-icon>arrow_back</mat-icon>\n </button>\n <h3>\n {{\n system.getLocalizedLabel(selectedProcess()?.key!) || selectedProcess()?.key ||\n (\"io.yuuvis.app.inbox.action.start-process.label\" | translate)\n }}\n </h3>\n </div>\n }\n\n <mat-progress-bar\n mode=\"indeterminate\"\n [ngClass]=\"{ busy: busy() }\"\n ></mat-progress-bar>\n\n @if(sfo) {\n <!-- start form of the selected process -->\n <div class=\"form\">\n <yuv-object-form\n #startForm\n [formOptions]=\"sfo\"\n (statusChanged)=\"onFormStatusChanged($event)\"\n ></yuv-object-form>\n </div>\n } @else {\n <!-- list of all available processes -->\n <yuv-list (itemSelect)=\"itemSelected($event)\" selectOnEnter=\"true\">\n @for(process of processDefinitions(); track process.id){\n <div yuvListItem>\n {{ system.getLocalizedLabel(process.key) || process.key }}\n <span class=\"desc\">{{ system.getLocalizedDescription(process.key) || process.description }}</span>\n </div>\n }\n </yuv-list>\n }\n </main>\n\n <footer>\n <button\n ymtButton=\"secondary\"\n type=\"button\"\n (click)=\"close()\"\n [disabled]=\"busy()\"\n >\n {{ \"io.yuuvis.app.inbox.actions.startProcess.button.cancel\" | translate }}\n </button>\n\n @if(sfo) {\n <button\n ymtButton=\"primary\"\n [disabled]=\"disableControls() || busy()\"\n (click)=\"startProcess(startForm())\"\n >\n {{ \"io.yuuvis.app.inbox.actions.startProcess.button.start\" | translate }}\n </button>\n }\n\n <!-- <button class=\"secondary\" [disabled]=\"busy()\" (click)=\"overlayRef.close()\">\n {{\n \"io.yuuvis.app.inbox.actions.startProcess.button.cancel\" | translate\n }}</button -->\n <!-- >} -->\n </footer>\n</yuv-dialog>\n", styles: [":host{display:flex;flex-flow:column;height:100%}:host main{flex:1;overflow:hidden;min-height:200px}:host main mat-progress-bar{position:absolute;z-index:1;opacity:0}:host main mat-progress-bar.busy{opacity:1}:host main .header{flex:0 0 auto;display:flex;align-items:center;padding:var(--ymt-spacing-xs);gap:var(--ymt-spacing-m);border-block-end:1px solid var(--ymt-outline-variant)}:host main .header h3{margin:0}:host main .form{padding:var(--ymt-spacing-xs);flex:1;overflow-y:auto}:host [yuvListItem]{--list-item-hover-background: var(--ymt-focus-background);padding:var(--ymt-spacing-m);border-block-end:1px solid var(--ymt-outline-variant);font:var(--ymt-font-title-small);cursor:pointer}:host [yuvListItem] span.desc:not(:empty){display:block;max-width:66ch;line-height:1.7em;font:var(--ymt-font-body-subtle);color:var(--ymt-text-color-subtle)}\n"] }]
|
|
155
159
|
}] });
|
|
156
160
|
|
|
157
161
|
class StartProcessAction extends AbstractContextAction {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yuuvis-app-inbox-extensions.mjs","sources":["../../../../projects/yuuvis/app-inbox/extensions/src/lib/actions/start-process/start-process.component.ts","../../../../projects/yuuvis/app-inbox/extensions/src/lib/actions/start-process/start-process.component.html","../../../../projects/yuuvis/app-inbox/extensions/src/lib/actions/start-process/start-process.action.ts","../../../../projects/yuuvis/app-inbox/extensions/src/lib/services/extensions.service.ts","../../../../projects/yuuvis/app-inbox/extensions/src/yuuvis-app-inbox-extensions.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n Component,\n inject,\n input,\n OnInit,\n signal,\n viewChild,\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport {\n AppInboxUtils,\n ProcessCreatePayload,\n ProcessVariable,\n} from '@yuuvis/app-inbox/shared';\nimport {\n ApiBase,\n BackendService,\n DmsObject,\n SystemService,\n TranslateModule,\n TranslateService,\n UserService,\n} from '@yuuvis/client-core';\nimport { DialogComponent } from '@yuuvis/client-framework/common';\nimport {\n ListComponent,\n ListItemDirective,\n} from '@yuuvis/client-framework/list';\nimport {\n FormStatusChangedEvent,\n ObjectFormComponent,\n ObjectFormOptions,\n} from '@yuuvis/client-framework/object-form';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { EMPTY, expand, finalize, map, Observable, skipWhile, tap } from 'rxjs';\n\n@Component({\n selector: 'ymi-start-process',\n standalone: true,\n imports: [\n CommonModule,\n ObjectFormComponent,\n MatIconModule,\n MatButtonModule,\n ListComponent,\n ListItemDirective,\n TranslateModule,\n DialogComponent,\n YmtButtonDirective,\n MatProgressBar,\n ],\n templateUrl: './start-process.component.html',\n styleUrl: './start-process.component.scss',\n})\nexport class StartProcessComponent implements OnInit {\n #backend = inject(BackendService);\n readonly translate = inject(TranslateService);\n readonly system = inject(SystemService)\n #userService = inject(UserService);\n #dialogData = inject<DmsObject>(MAT_DIALOG_DATA);\n readonly #dialogRef = inject(MatDialogRef<StartProcessComponent>);\n\n startForm = viewChild(ObjectFormComponent);\n\n processDefinitions = signal<ProcessDefinition[]>([]);\n\n selectedProcess = signal<ProcessDefinition | null>(null);\n startFormOptions = signal<ObjectFormOptions | null>(null);\n disableControls = signal<boolean>(false);\n\n object = input<DmsObject | null>(this.#dialogData);\n busy = signal<boolean>(false);\n\n itemSelected(idx: number[]) {\n this.#onItemSelect(this.processDefinitions()[idx[0]]);\n }\n\n #onItemSelect(p: ProcessDefinition) {\n this.busy.set(true);\n this.selectedProcess.set(p);\n const formKey = `${p.key}-startform`;\n this.#backend.get(`/resources/config/${formKey}`).subscribe({\n next: (res) => {\n this.busy.set(false);\n const formModel = AppInboxUtils.fixFormModel(res.tenant || res.global);\n this.startFormOptions.set(\n formModel\n ? {\n formModel,\n data: {},\n }\n : null\n );\n },\n error: (err) => {\n this.busy.set(false);\n console.error('Error fetching start form:', err);\n this.startFormOptions.set(null);\n },\n });\n }\n\n startProcess(of?: ObjectFormComponent) {\n const process = this.selectedProcess();\n if (!of || !process) return;\n const formData: Record<string, unknown> = of.getFormData();\n const formElements: Record<string, unknown & { type: string }> =\n of.getFormElements();\n const variables: ProcessVariable[] = Object.keys(formData).map((key) =>\n AppInboxUtils.getProcessVariables(formData[key], formElements[key], key)\n );\n\n const o = this.object();\n const attachments = o?.id ? [o.id] : [];\n\n const payload: ProcessCreatePayload = {\n processDefinitionKey: process.key,\n variables,\n name: this.translate.instant(process.name) || process.name,\n attachments,\n };\n\n this.busy.set(true);\n this.#startProcess(payload)\n .pipe(finalize(() => this.busy.set(false)))\n .subscribe({\n next: (res) => {\n this.#dialogRef.close(res);\n },\n error: (err) => {\n console.error('Error starting process:', err);\n },\n });\n }\n /**\n * Start a process. This will create a new process instance.\n * @param payload Payload to be send with the start process request (may contain attachments, a new subject or variables)\n */\n #startProcess(payload: ProcessCreatePayload): Observable<any> {\n return this.#backend.post(`/bpm/processes`, payload);\n }\n\n resetSelectedProcess() {\n this.startFormOptions.set(null);\n this.selectedProcess.set(null);\n }\n\n onFormStatusChanged(evt: FormStatusChangedEvent) {\n this.disableControls.set(evt.invalid);\n }\n\n #getAllProcessDefinitions(): Observable<ProcessDefinition[]> {\n let items: ProcessDefinition[] = [];\n let i = 0;\n const currentUserId = this.#userService.getCurrentUser().id;\n\n this.busy.set(true);\n\n return this.#getPage(currentUserId, i).pipe(\n expand((res: any) => {\n i++;\n return res.hasMoreItems ? this.#getPage(currentUserId, i) : EMPTY;\n }),\n tap((res: any) => {\n // TODO: this.#iconRegistry.addSvgIconLiteralInNamespace(\n items = [...items, ...res.objects];\n }),\n skipWhile((res: any) => res.hasMoreItems),\n map(() => items),\n finalize(() => this.busy.set(false))\n );\n }\n\n #getPage(\n startableByUser: string,\n index?: number,\n category?: string\n ): Observable<any> {\n return this.#backend.get(\n `/bpm-engine/api/process-definitions?page=${index}&latest=true&startableByUser=${startableByUser}`,\n ApiBase.none\n );\n }\n\n close() {\n this.#dialogRef.close();\n }\n\n ngOnInit(): void {\n this.#getAllProcessDefinitions()\n .pipe(\n tap((processDefinitions) => {\n processDefinitions = Array.from(\n processDefinitions\n // Remove duplicates by key, keeping only the one with the highest version\n .reduce<Map<string, ProcessDefinition>>((acc, cur) => {\n const prev = acc.get(cur.key);\n if (!prev || cur.version > prev.version) {\n acc.set(cur.key, cur);\n }\n return acc;\n }, new Map())\n .values()\n );\n\n this.processDefinitions.set(processDefinitions || []);\n })\n )\n .subscribe();\n }\n}\n\nexport interface ProcessDefinition {\n category: string;\n description: string;\n global: boolean;\n id: string;\n key: string;\n name: string;\n startFormDefined: true;\n suspended: false;\n version: number;\n}\n\nexport interface LoggedInUser {\n username: string;\n id: string;\n email: string;\n firstname: string;\n lastname: string;\n enabled: boolean;\n tenant: string;\n authorities: string[];\n displayName: string;\n}\n","@let sfo = startFormOptions();\n\n<yuv-dialog\n [headertitel]=\"'io.yuuvis.app.inbox.action.start-process.label' | translate\"\n>\n <!-- eader>\n <h2>{{ selectedProcess()?.name }}</h2>\n } @else {\n <h2>{{ \"io.yuuvis.app.inbox.action.start-process.label\" | translate }}</h2>\n }\n </header> -->\n\n <main>\n @if(sfo) {\n <div class=\"header\">\n <button\n mat-icon-button\n [disabled]=\"busy()\"\n (click)=\"resetSelectedProcess()\"\n >\n <mat-icon>arrow_back</mat-icon>\n </button>\n <h3>\n {{\n system.getLocalizedLabel(selectedProcess()?.name!) || selectedProcess()?.name ||\n (\"io.yuuvis.app.inbox.action.start-process.label\" | translate)\n }}\n </h3>\n </div>\n }\n\n <mat-progress-bar\n mode=\"indeterminate\"\n [ngClass]=\"{ busy: busy() }\"\n ></mat-progress-bar>\n\n @if(sfo) {\n <!-- start form of the selected process -->\n <div class=\"form\">\n <yuv-object-form\n #startForm\n [formOptions]=\"sfo\"\n (statusChanged)=\"onFormStatusChanged($event)\"\n ></yuv-object-form>\n </div>\n } @else {\n <!-- list of all available processes -->\n <yuv-list (itemSelect)=\"itemSelected($event)\">\n @for(process of processDefinitions(); track process.id){\n <div yuvListItem>\n {{ system.getLocalizedLabel(process.name) || process.name }}\n <span class=\"desc\">{{ system.getLocalizedDescription(process.name) || process.description }}</span>\n </div>\n }\n </yuv-list>\n }\n </main>\n\n <footer>\n <button\n ymtButton=\"secondary\"\n type=\"button\"\n (click)=\"close()\"\n [disabled]=\"busy()\"\n >\n {{ \"io.yuuvis.app.inbox.actions.startProcess.button.cancel\" | translate }}\n </button>\n\n @if(sfo) {\n <button\n ymtButton=\"primary\"\n [disabled]=\"disableControls() || busy()\"\n (click)=\"startProcess(startForm())\"\n >\n {{ \"io.yuuvis.app.inbox.actions.startProcess.button.start\" | translate }}\n </button>\n }\n\n <!-- <button class=\"secondary\" [disabled]=\"busy()\" (click)=\"overlayRef.close()\">\n {{\n \"io.yuuvis.app.inbox.actions.startProcess.button.cancel\" | translate\n }}</button -->\n <!-- >} -->\n </footer>\n</yuv-dialog>\n","import { inject } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { TranslateService } from '@ngx-translate/core';\nimport { DmsObject } from '@yuuvis/client-core';\nimport {\n AbstractContextAction,\n Action,\n ActionSupport,\n SelectionRange,\n} from '@yuuvis/client-framework/actions';\nimport { Observable, of } from 'rxjs';\nimport { StartProcessComponent } from './start-process.component';\n\nexport class StartProcessAction\n extends AbstractContextAction\n implements Action\n{\n private translate = inject(TranslateService);\n #dialog = inject(MatDialog);\n\n id = 'io.yuuvis.app.inbox.action.start-process';\n label = this.translate.instant(\n 'io.yuuvis.app.inbox.action.start-process.label'\n );\n description = this.translate.instant(\n 'io.yuuvis.app.inbox.action.start-process.description'\n );\n priority = 2;\n icon = 'flowsheet';\n group = 'common';\n range = SelectionRange.SINGLE_SELECT;\n supports: ActionSupport = {};\n\n isExecutable(selection: DmsObject[]) {\n const o = selection[0];\n return of(!!o);\n }\n\n run(selection: DmsObject[]): Observable<boolean> {\n this.#dialog.open(StartProcessComponent, {\n minWidth: '400px',\n maxHeight: '90vh',\n data: selection[0],\n });\n return of(true);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ActionsService } from '@yuuvis/client-framework/actions';\nimport { StartProcessAction } from '../actions/start-process/start-process.action';\nimport { ClientShellExtension } from '@yuuvis/client-shell-core';\n\n@Injectable()\nexport class InboxExtensions implements ClientShellExtension {\n #actionsService = inject(ActionsService);\n #actions = [\n {\n id: 'io.yuuvis.app.inbox.action.start-process',\n action: StartProcessAction,\n },\n ];\n\n init(): Promise<any> {\n // register actions\n this.#actionsService.registerActions(this.#actions);\n return Promise.resolve();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["TranslateService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"yuuvis-app-inbox-extensions.mjs","sources":["../../../../projects/yuuvis/app-inbox/extensions/src/lib/actions/start-process/start-process.component.ts","../../../../projects/yuuvis/app-inbox/extensions/src/lib/actions/start-process/start-process.component.html","../../../../projects/yuuvis/app-inbox/extensions/src/lib/actions/start-process/start-process.action.ts","../../../../projects/yuuvis/app-inbox/extensions/src/lib/services/extensions.service.ts","../../../../projects/yuuvis/app-inbox/extensions/src/yuuvis-app-inbox-extensions.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n Component,\n inject,\n input,\n OnInit,\n signal,\n viewChild,\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport {\n AppInboxUtils,\n ProcessCreatePayload,\n ProcessVariable,\n} from '@yuuvis/app-inbox/shared';\nimport {\n ApiBase,\n BackendService,\n DmsObject,\n NotificationService,\n SystemService,\n TranslateModule,\n TranslateService,\n UserService,\n} from '@yuuvis/client-core';\nimport { DialogComponent } from '@yuuvis/client-framework/common';\nimport {\n ListComponent,\n ListItemDirective,\n} from '@yuuvis/client-framework/list';\nimport {\n FormStatusChangedEvent,\n ObjectFormComponent,\n ObjectFormOptions,\n} from '@yuuvis/client-framework/object-form';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { EMPTY, expand, finalize, map, Observable, skipWhile, tap } from 'rxjs';\n\n@Component({\n selector: 'ymi-start-process',\n standalone: true,\n imports: [\n CommonModule,\n ObjectFormComponent,\n MatIconModule,\n MatButtonModule,\n ListComponent,\n ListItemDirective,\n TranslateModule,\n DialogComponent,\n YmtButtonDirective,\n MatProgressBar,\n ],\n templateUrl: './start-process.component.html',\n styleUrl: './start-process.component.scss',\n})\nexport class StartProcessComponent implements OnInit {\n #backend = inject(BackendService);\n readonly translate = inject(TranslateService);\n readonly system = inject(SystemService)\n #userService = inject(UserService);\n #notificationService = inject(NotificationService);\n #dialogData = inject<DmsObject>(MAT_DIALOG_DATA);\n readonly #dialogRef = inject(MatDialogRef<StartProcessComponent>);\n\n startForm = viewChild(ObjectFormComponent);\n\n processDefinitions = signal<ProcessDefinition[]>([]);\n\n selectedProcess = signal<ProcessDefinition | null>(null);\n startFormOptions = signal<ObjectFormOptions | null>(null);\n disableControls = signal<boolean>(false);\n\n object = input<DmsObject | null>(this.#dialogData);\n busy = signal<boolean>(false);\n\n itemSelected(idx: number[]) {\n this.#onItemSelect(this.processDefinitions()[idx[0]]);\n }\n\n #onItemSelect(p: ProcessDefinition) {\n this.busy.set(true);\n this.selectedProcess.set(p);\n const formKey = `${p.key}-startform`;\n this.#backend.get(`/resources/config/${formKey}`).subscribe({\n next: (res) => {\n this.busy.set(false);\n const formModel = AppInboxUtils.fixFormModel(res.tenant || res.global);\n this.startFormOptions.set(\n formModel\n ? {\n formModel,\n data: {},\n }\n : null\n );\n },\n error: (err) => {\n this.busy.set(false);\n console.error('Error fetching start form:', err);\n this.startFormOptions.set(null);\n },\n });\n }\n\n startProcess(of?: ObjectFormComponent) {\n const process = this.selectedProcess();\n if (!of || !process) return;\n const formData: Record<string, unknown> = of.getFormData();\n const formElements: Record<string, unknown & { type: string }> =\n of.getFormElements();\n const variables: ProcessVariable[] = Object.keys(formData).map((key) =>\n AppInboxUtils.getProcessVariables(formData[key], formElements[key], key)\n );\n\n const o = this.object();\n const attachments = o?.id ? [o.id] : [];\n\n const subject = variables.find(variable => variable.name === 'title')?.value;\n\n const payload: ProcessCreatePayload = {\n processDefinitionKey: process.key,\n variables,\n name: subject || this.system.getLocalizedLabel(process.name) || process.name,\n attachments,\n };\n\n this.busy.set(true);\n this.#startProcess(payload)\n .pipe(finalize(() => this.busy.set(false)))\n .subscribe({\n next: (res) => {\n this.#dialogRef.close(res);\n this.#notificationService.success(this.translate.instant('io.yuuvis.app.inbox.actions.startProcess.success', { processName: payload.name }));\n },\n error: (err) => {\n console.error('Error starting process:', err);\n this.#notificationService.error(this.translate.instant('io.yuuvis.app.inbox.actions.startProcess.error', { processName: payload.name }));\n },\n });\n }\n /**\n * Start a process. This will create a new process instance.\n * @param payload Payload to be send with the start process request (may contain attachments, a new subject or variables)\n */\n #startProcess(payload: ProcessCreatePayload): Observable<any> {\n return this.#backend.post(`/bpm/processes`, payload);\n }\n\n resetSelectedProcess() {\n this.startFormOptions.set(null);\n this.selectedProcess.set(null);\n }\n\n onFormStatusChanged(evt: FormStatusChangedEvent) {\n this.disableControls.set(evt.invalid);\n }\n\n #getAllProcessDefinitions(): Observable<ProcessDefinition[]> {\n let items: ProcessDefinition[] = [];\n let i = 0;\n const currentUserId = this.#userService.getCurrentUser().id;\n\n this.busy.set(true);\n\n return this.#getPage(currentUserId, i).pipe(\n expand((res: any) => {\n i++;\n return res.hasMoreItems ? this.#getPage(currentUserId, i) : EMPTY;\n }),\n tap((res: any) => {\n // TODO: this.#iconRegistry.addSvgIconLiteralInNamespace(\n items = [...items, ...res.objects];\n }),\n skipWhile((res: any) => res.hasMoreItems),\n map(() => items),\n finalize(() => this.busy.set(false))\n );\n }\n\n #getPage(\n startableByUser: string,\n index?: number,\n category?: string\n ): Observable<any> {\n return this.#backend.get(\n `/bpm-engine/api/process-definitions?page=${index}&latest=true&startableByUser=${startableByUser}`,\n ApiBase.none\n );\n }\n\n close() {\n this.#dialogRef.close();\n }\n\n ngOnInit(): void {\n this.#getAllProcessDefinitions()\n .pipe(\n tap((processDefinitions) => {\n processDefinitions = Array.from(\n processDefinitions.filter(pD => !pD.suspended)\n // Remove duplicates by key, keeping only the one with the highest version\n .reduce<Map<string, ProcessDefinition>>((acc, cur) => {\n const prev = acc.get(cur.key);\n if (!prev || cur.version > prev.version) {\n acc.set(cur.key, cur);\n }\n return acc;\n }, new Map())\n .values()\n );\n\n this.processDefinitions.set(processDefinitions || []);\n })\n )\n .subscribe();\n }\n}\n\nexport interface ProcessDefinition {\n category: string;\n description: string;\n global: boolean;\n id: string;\n key: string;\n name: string;\n startFormDefined: true;\n suspended: false;\n version: number;\n}\n\nexport interface LoggedInUser {\n username: string;\n id: string;\n email: string;\n firstname: string;\n lastname: string;\n enabled: boolean;\n tenant: string;\n authorities: string[];\n displayName: string;\n}\n","@let sfo = startFormOptions();\n\n<yuv-dialog\n [headertitel]=\"'io.yuuvis.app.inbox.action.start-process.label' | translate\"\n>\n <!-- eader>\n <h2>{{ selectedProcess()?.name }}</h2>\n } @else {\n <h2>{{ \"io.yuuvis.app.inbox.action.start-process.label\" | translate }}</h2>\n }\n </header> -->\n\n <main>\n @if(sfo) {\n <div class=\"header\">\n <button\n mat-icon-button\n [disabled]=\"busy()\"\n (click)=\"resetSelectedProcess()\"\n >\n <mat-icon>arrow_back</mat-icon>\n </button>\n <h3>\n {{\n system.getLocalizedLabel(selectedProcess()?.key!) || selectedProcess()?.key ||\n (\"io.yuuvis.app.inbox.action.start-process.label\" | translate)\n }}\n </h3>\n </div>\n }\n\n <mat-progress-bar\n mode=\"indeterminate\"\n [ngClass]=\"{ busy: busy() }\"\n ></mat-progress-bar>\n\n @if(sfo) {\n <!-- start form of the selected process -->\n <div class=\"form\">\n <yuv-object-form\n #startForm\n [formOptions]=\"sfo\"\n (statusChanged)=\"onFormStatusChanged($event)\"\n ></yuv-object-form>\n </div>\n } @else {\n <!-- list of all available processes -->\n <yuv-list (itemSelect)=\"itemSelected($event)\" selectOnEnter=\"true\">\n @for(process of processDefinitions(); track process.id){\n <div yuvListItem>\n {{ system.getLocalizedLabel(process.key) || process.key }}\n <span class=\"desc\">{{ system.getLocalizedDescription(process.key) || process.description }}</span>\n </div>\n }\n </yuv-list>\n }\n </main>\n\n <footer>\n <button\n ymtButton=\"secondary\"\n type=\"button\"\n (click)=\"close()\"\n [disabled]=\"busy()\"\n >\n {{ \"io.yuuvis.app.inbox.actions.startProcess.button.cancel\" | translate }}\n </button>\n\n @if(sfo) {\n <button\n ymtButton=\"primary\"\n [disabled]=\"disableControls() || busy()\"\n (click)=\"startProcess(startForm())\"\n >\n {{ \"io.yuuvis.app.inbox.actions.startProcess.button.start\" | translate }}\n </button>\n }\n\n <!-- <button class=\"secondary\" [disabled]=\"busy()\" (click)=\"overlayRef.close()\">\n {{\n \"io.yuuvis.app.inbox.actions.startProcess.button.cancel\" | translate\n }}</button -->\n <!-- >} -->\n </footer>\n</yuv-dialog>\n","import { inject } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { TranslateService } from '@ngx-translate/core';\nimport { DmsObject } from '@yuuvis/client-core';\nimport {\n AbstractContextAction,\n Action,\n ActionSupport,\n SelectionRange,\n} from '@yuuvis/client-framework/actions';\nimport { Observable, of } from 'rxjs';\nimport { StartProcessComponent } from './start-process.component';\n\nexport class StartProcessAction\n extends AbstractContextAction\n implements Action\n{\n private translate = inject(TranslateService);\n #dialog = inject(MatDialog);\n\n id = 'io.yuuvis.app.inbox.action.start-process';\n label = this.translate.instant(\n 'io.yuuvis.app.inbox.action.start-process.label'\n );\n description = this.translate.instant(\n 'io.yuuvis.app.inbox.action.start-process.description'\n );\n priority = 2;\n icon = 'flowsheet';\n group = 'common';\n range = SelectionRange.SINGLE_SELECT;\n supports: ActionSupport = {};\n\n isExecutable(selection: DmsObject[]) {\n const o = selection[0];\n return of(!!o);\n }\n\n run(selection: DmsObject[]): Observable<boolean> {\n this.#dialog.open(StartProcessComponent, {\n minWidth: '400px',\n maxHeight: '90vh',\n data: selection[0],\n });\n return of(true);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { ActionsService } from '@yuuvis/client-framework/actions';\nimport { StartProcessAction } from '../actions/start-process/start-process.action';\nimport { ClientShellExtension } from '@yuuvis/client-shell-core';\n\n@Injectable()\nexport class InboxExtensions implements ClientShellExtension {\n #actionsService = inject(ActionsService);\n #actions = [\n {\n id: 'io.yuuvis.app.inbox.action.start-process',\n action: StartProcessAction,\n },\n ];\n\n init(): Promise<any> {\n // register actions\n this.#actionsService.registerActions(this.#actions);\n return Promise.resolve();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["TranslateService"],"mappings":";;;;;;;;;;;;;;;;;;;;;MA2Da,qBAAqB,CAAA;AAChC,IAAA,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;AACxB,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACpC,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AACvC,IAAA,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC;AAClC,IAAA,oBAAoB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAClD,IAAA,WAAW,GAAG,MAAM,CAAY,eAAe,CAAC;AACvC,IAAA,UAAU,GAAG,MAAM,EAAC,YAAmC,EAAC;AAEjE,IAAA,SAAS,GAAG,SAAS,CAAC,mBAAmB,CAAC;AAE1C,IAAA,kBAAkB,GAAG,MAAM,CAAsB,EAAE,CAAC;AAEpD,IAAA,eAAe,GAAG,MAAM,CAA2B,IAAI,CAAC;AACxD,IAAA,gBAAgB,GAAG,MAAM,CAA2B,IAAI,CAAC;AACzD,IAAA,eAAe,GAAG,MAAM,CAAU,KAAK,CAAC;AAExC,IAAA,MAAM,GAAG,KAAK,CAAmB,IAAI,CAAC,WAAW,CAAC;AAClD,IAAA,IAAI,GAAG,MAAM,CAAU,KAAK,CAAC;AAE7B,IAAA,YAAY,CAAC,GAAa,EAAA;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;;AAGvD,IAAA,aAAa,CAAC,CAAoB,EAAA;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,QAAA,MAAM,OAAO,GAAG,CAAA,EAAG,CAAC,CAAC,GAAG,YAAY;QACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAqB,kBAAA,EAAA,OAAO,CAAE,CAAA,CAAC,CAAC,SAAS,CAAC;AAC1D,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,gBAAA,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;AACtE,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACvB;AACE,sBAAE;wBACE,SAAS;AACT,wBAAA,IAAI,EAAE,EAAE;AACT;sBACD,IAAI,CACT;aACF;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,gBAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC;AAChD,gBAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;aAChC;AACF,SAAA,CAAC;;AAGJ,IAAA,YAAY,CAAC,EAAwB,EAAA;AACnC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE;AACtC,QAAA,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO;YAAE;AACrB,QAAA,MAAM,QAAQ,GAA4B,EAAE,CAAC,WAAW,EAAE;AAC1D,QAAA,MAAM,YAAY,GAChB,EAAE,CAAC,eAAe,EAAE;AACtB,QAAA,MAAM,SAAS,GAAsB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KACjE,aAAa,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CACzE;AAED,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACvB,QAAA,MAAM,WAAW,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;AAEvC,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,KAAK;AAE5E,QAAA,MAAM,OAAO,GAAyB;YACpC,oBAAoB,EAAE,OAAO,CAAC,GAAG;YACjC,SAAS;AACT,YAAA,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI;YAC5E,WAAW;SACZ;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,aAAa,CAAC,OAAO;AACvB,aAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACzC,aAAA,SAAS,CAAC;AACT,YAAA,IAAI,EAAE,CAAC,GAAG,KAAI;AACZ,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC;gBAC1B,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,kDAAkD,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;aAC7I;AACD,YAAA,KAAK,EAAE,CAAC,GAAG,KAAI;AACb,gBAAA,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC;gBAC7C,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,gDAAgD,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;aACzI;AACF,SAAA,CAAC;;AAEN;;;AAGG;AACH,IAAA,aAAa,CAAC,OAA6B,EAAA;QACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAgB,cAAA,CAAA,EAAE,OAAO,CAAC;;IAGtD,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;;AAGhC,IAAA,mBAAmB,CAAC,GAA2B,EAAA;QAC7C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;;IAGvC,yBAAyB,GAAA;QACvB,IAAI,KAAK,GAAwB,EAAE;QACnC,IAAI,CAAC,GAAG,CAAC;QACT,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,EAAE;AAE3D,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AAEnB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CACzC,MAAM,CAAC,CAAC,GAAQ,KAAI;AAClB,YAAA,CAAC,EAAE;AACH,YAAA,OAAO,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,KAAK;AACnE,SAAC,CAAC,EACF,GAAG,CAAC,CAAC,GAAQ,KAAI;;YAEf,KAAK,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;AACpC,SAAC,CAAC,EACF,SAAS,CAAC,CAAC,GAAQ,KAAK,GAAG,CAAC,YAAY,CAAC,EACzC,GAAG,CAAC,MAAM,KAAK,CAAC,EAChB,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CACrC;;AAGH,IAAA,QAAQ,CACN,eAAuB,EACvB,KAAc,EACd,QAAiB,EAAA;AAEjB,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CACtB,CAA4C,yCAAA,EAAA,KAAK,CAAgC,6BAAA,EAAA,eAAe,EAAE,EAClG,OAAO,CAAC,IAAI,CACb;;IAGH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;;IAGzB,QAAQ,GAAA;QACN,IAAI,CAAC,yBAAyB;AAC3B,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,kBAAkB,KAAI;AACzB,YAAA,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAC7B,kBAAkB,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS;;AAE1C,iBAAA,MAAM,CAAiC,CAAC,GAAG,EAAE,GAAG,KAAI;gBACnD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;gBAC7B,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;oBACvC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;;AAEvB,gBAAA,OAAO,GAAG;AACZ,aAAC,EAAE,IAAI,GAAG,EAAE;iBACX,MAAM,EAAE,CACZ;YAED,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;AACvD,SAAC,CAAC;AAEH,aAAA,SAAS,EAAE;;wGA/JL,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EASV,mBAAmB,ECpE3C,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,w1EAqFA,44BDxCI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,mBAAmB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,OAAA,EAAA,mBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,aAAa,EACb,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,qBAAA,EAAA,YAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,iBAAiB,EACjB,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,4FACf,eAAe,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAKL,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAlBjC,SAAS;+BACE,mBAAmB,EAAA,UAAA,EACjB,IAAI,EACP,OAAA,EAAA;wBACP,YAAY;wBACZ,mBAAmB;wBACnB,aAAa;wBACb,eAAe;wBACf,aAAa;wBACb,iBAAiB;wBACjB,eAAe;wBACf,eAAe;wBACf,kBAAkB;wBAClB,cAAc;AACf,qBAAA,EAAA,QAAA,EAAA,w1EAAA,EAAA,MAAA,EAAA,CAAA,q1BAAA,CAAA,EAAA;;;AE1CG,MAAO,kBACX,SAAQ,qBAAqB,CAAA;AAGrB,IAAA,SAAS,GAAG,MAAM,CAACA,kBAAgB,CAAC;AAC5C,IAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;IAE3B,EAAE,GAAG,0CAA0C;IAC/C,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAC5B,gDAAgD,CACjD;IACD,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAClC,sDAAsD,CACvD;IACD,QAAQ,GAAG,CAAC;IACZ,IAAI,GAAG,WAAW;IAClB,KAAK,GAAG,QAAQ;AAChB,IAAA,KAAK,GAAG,cAAc,CAAC,aAAa;IACpC,QAAQ,GAAkB,EAAE;AAE5B,IAAA,YAAY,CAAC,SAAsB,EAAA;AACjC,QAAA,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;AACtB,QAAA,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;;AAGhB,IAAA,GAAG,CAAC,SAAsB,EAAA;AACxB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE;AACvC,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;AACnB,SAAA,CAAC;AACF,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC;;AAElB;;MCxCY,eAAe,CAAA;AAC1B,IAAA,eAAe,GAAG,MAAM,CAAC,cAAc,CAAC;AACxC,IAAA,QAAQ,GAAG;AACT,QAAA;AACE,YAAA,EAAE,EAAE,0CAA0C;AAC9C,YAAA,MAAM,EAAE,kBAAkB;AAC3B,SAAA;KACF;IAED,IAAI,GAAA;;QAEF,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;AACnD,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;;wGAZf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;4GAAf,eAAe,EAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;ACLD;;AAEG;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yuuvis-app-inbox-shared.mjs","sources":["../../../../projects/yuuvis/app-inbox/shared/src/inbox.interface.ts","../../../../projects/yuuvis/app-inbox/shared/src/utils.ts","../../../../projects/yuuvis/app-inbox/shared/src/inbox.schema.ts","../../../../projects/yuuvis/app-inbox/shared/src/yuuvis-app-inbox-shared.ts"],"sourcesContent":["import { Pagination } from '@yuuvis/client-framework/pagination';\nexport interface ProcessVariable {\n name: string;\n type?: string;\n value: any;\n // TODO: Not yet supported by BPM-Engine\n readonly?: boolean;\n scope?: string;\n}\n\nexport const ProcessAction = {\n complete: 'complete',\n claim: 'claim',\n delegate: 'delegate',\n resolve: 'resolve',\n save: 'save',\n};\n\nexport interface TasksResponse {\n objects: Task[];\n hasMoreItems: boolean;\n totalNumItems: number;\n numItems: number;\n}\n\n// State emitted by the inbox service\nexport interface InboxState {\n tasks: Task[];\n pagination?: Pagination;\n sort: string;\n isAssigned: boolean,\n searchConditions?: InboxSearchConditions;\n}\n\nexport interface InboxSearchConditions {\n nameLikeIgnoreCase?: string;\n}\n\n/**\n * A task is an entry in a users inbox.\n */\nexport interface Task {\n id: string;\n // ID of the process instance that contains this task/activity\n processInstanceId: string;\n taskDefinitionKey: string;\n assignee: ProcessUser;\n claimTime: Date;\n createTime: Date;\n dueDate: Date;\n description: string;\n taskMessages?: TaskMessage[];\n taskForm?: {\n schemaProperties?: string[];\n model?: any;\n data?: any;\n outcomes?: TaskOutcome[];\n };\n delegationState?: string;\n formKey: string;\n initiator: ProcessUser;\n name: string;\n owner: ProcessUser;\n parentTaskId: string;\n processDefinition: {\n id: string;\n idPrefix: string;\n name: string;\n description: string;\n };\n suspended: false;\n variables: ProcessVariable[];\n resolvedValues?: { [id: string]: string };\n attachments: string[];\n}\n\nexport interface ProcessUser {\n id: string;\n title: string;\n}\n\nexport interface TaskMessage {\n level?: string;\n type?: string;\n message: string;\n}\n\n/**\n * A task outcome is basically an action that will be rendered as a button in the\n * task form. When the button is clicked, the outcome will be triggered.\n */\nexport interface TaskOutcome {\n // the outcomes technical name (also used for translations)\n name: string;\n // Name of the variable that this outcome will write to process vars\n variable: string;\n // The vaue that this outcome will write to process vars\n value: any;\n /**\n * Optional form model. Could be the model object as well as a string (Id\n * to fetch a form model from the backend).\n *\n * If you provide a model, triggering the outcome will display/render this form\n * alongside with the tasks form. Values of all rendered forms will be put into\n * the process variables\n */\n model?: any;\n /**\n * Outcomes will be rendered as primary buttons. If you want an outcome\n * to be less prominent you could set this property to 'true'\n */\n secondary?: boolean;\n}\n\nexport interface ProcessCreatePayload extends ProcessPostPayload {\n processDefinitionKey: string;\n name?: string;\n businessKey?: string;\n returnVariables?: boolean;\n}\n// payload for post requests to the bpm backend\nexport interface ProcessPostPayload {\n variables?: ProcessVariable[];\n attachments?: string[];\n}\n","import { APP_INBOX_NAME } from './inbox.schema';\nimport { ProcessVariable } from './inbox.interface';\n\nexport class AppInboxUtils {\n /**\n * Fixes the form model by ensuring that it contains 'core' and 'data' elements.\n * If these elements are missing, they are added to the form model.\n * @param formModel The form model to be fixed.\n * @returns The fixed form model\n */\n static fixFormModel(formModel: any): any {\n if (!formModel.elements.find((e: any) => e.name === 'core')) {\n formModel.elements.push({\n name: 'core',\n type: 'o2mGroup',\n elements: [],\n });\n }\n if (!formModel.elements.find((e: any) => e.name === 'data')) {\n formModel.elements.push({\n name: 'data',\n type: 'o2mGroupStack',\n elements: [],\n });\n }\n return formModel;\n }\n\n static getIconKey(processIdPrefix: string) {\n return `${encodeURIComponent('bpm:' + processIdPrefix)}`;\n }\n\n static getIconNamespace() {\n return `io.yuuvis.app.inbox`;\n }\n\n static getVariableType(element: any): string {\n if (element.cardinality === 'multi') return 'json';\n switch (element.type) {\n case 'o2mGroup':\n case 'o2mGroupStack':\n return 'object';\n case 'o2mList':\n return 'array';\n case 'o2mTable':\n case 'table':\n return 'table';\n case 'o2mForm':\n return 'form';\n case 'datetime':\n return 'date';\n case 'decimal':\n return 'double';\n default:\n return element.type;\n }\n }\n\n static getVariableValue(formValue: any, type: string): any {\n switch (type) {\n case 'table':\n if (formValue)\n formValue.forEach((row: any) =>\n Object.keys(row).forEach((k) => {\n if (k.endsWith('_title')) {\n delete row[k];\n }\n })\n );\n return formValue;\n default:\n return formValue;\n }\n }\n\n static getProcessVariables(\n formData: unknown,\n formElements: unknown & { type: string },\n name: string\n ): ProcessVariable {\n return {\n name,\n value: AppInboxUtils.getVariableValue(formData, formElements.type),\n type: AppInboxUtils.getVariableType(formElements),\n };\n }\n}\n","\n\nexport const APP_INBOX_ID = 'io.yuuvis.app.inbox';\nexport const APP_INBOX_NAME = 'yuuvis Inbox';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAUa,MAAA,aAAa,GAAG;AAC3B,IAAA,QAAQ,EAAE,UAAU;AACpB,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,QAAQ,EAAE,UAAU;AACpB,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,IAAI,EAAE,MAAM;;;MCZD,aAAa,CAAA;AACxB;;;;;AAKG;IACH,OAAO,YAAY,CAAC,SAAc,EAAA;AAChC,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE;AAC3D,YAAA,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;AACtB,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,QAAQ,EAAE,EAAE;AACb,aAAA,CAAC;;AAEJ,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE;AAC3D,YAAA,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;AACtB,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,IAAI,EAAE,eAAe;AACrB,gBAAA,QAAQ,EAAE,EAAE;AACb,aAAA,CAAC;;AAEJ,QAAA,OAAO,SAAS;;IAGlB,OAAO,UAAU,CAAC,eAAuB,EAAA;QACvC,OAAO,CAAA,EAAG,kBAAkB,CAAC,MAAM,GAAG,eAAe,CAAC,EAAE;;AAG1D,IAAA,OAAO,gBAAgB,GAAA;AACrB,QAAA,OAAO,qBAAqB;;IAG9B,OAAO,eAAe,CAAC,OAAY,EAAA;AACjC,QAAA,IAAI,OAAO,CAAC,WAAW,KAAK,OAAO;AAAE,YAAA,OAAO,MAAM;AAClD,QAAA,QAAQ,OAAO,CAAC,IAAI;AAClB,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,eAAe;AAClB,gBAAA,OAAO,QAAQ;AACjB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,OAAO;AAChB,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,OAAO;AAChB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,QAAQ;AACjB,YAAA;gBACE,OAAO,OAAO,CAAC,IAAI;;;AAIzB,IAAA,OAAO,gBAAgB,CAAC,SAAc,EAAE,IAAY,EAAA;QAClD,QAAQ,IAAI;AACV,YAAA,KAAK,OAAO;AACV,gBAAA,IAAI,SAAS;oBACX,SAAS,CAAC,OAAO,CAAC,CAAC,GAAQ,KACzB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AAC7B,wBAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AACxB,4BAAA,OAAO,GAAG,CAAC,CAAC,CAAC;;qBAEhB,CAAC,CACH;AACH,gBAAA,OAAO,SAAS;AAClB,YAAA;AACE,gBAAA,OAAO,SAAS;;;AAItB,IAAA,OAAO,mBAAmB,CACxB,QAAiB,EACjB,YAAwC,EACxC,IAAY,EAAA;QAEZ,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC;AAClE,YAAA,IAAI,EAAE,aAAa,CAAC,eAAe,CAAC,YAAY,CAAC;SAClD;;AAEJ;;ACpFM,MAAM,YAAY,GAAG;AACrB,MAAM,cAAc,GAAG;;ACH9B;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"yuuvis-app-inbox-shared.mjs","sources":["../../../../projects/yuuvis/app-inbox/shared/src/inbox.interface.ts","../../../../projects/yuuvis/app-inbox/shared/src/utils.ts","../../../../projects/yuuvis/app-inbox/shared/src/inbox.schema.ts","../../../../projects/yuuvis/app-inbox/shared/src/yuuvis-app-inbox-shared.ts"],"sourcesContent":["import { Pagination } from '@yuuvis/client-framework/pagination';\nexport interface ProcessVariable {\n name: string;\n type?: string;\n value: any;\n // TODO: Not yet supported by BPM-Engine\n readonly?: boolean;\n scope?: string;\n}\n\nexport const ProcessAction = {\n complete: 'complete',\n claim: 'claim',\n delegate: 'delegate',\n resolve: 'resolve',\n save: 'save',\n};\n\nexport interface TasksResponse {\n objects: Task[];\n hasMoreItems: boolean;\n totalNumItems: number;\n numItems: number;\n}\n\n// State emitted by the inbox service\nexport interface InboxState {\n tasks: Task[];\n pagination?: Pagination;\n sort: string;\n isAssigned: boolean,\n searchConditions?: InboxSearchConditions;\n}\n\nexport interface InboxSearchConditions {\n nameLikeIgnoreCase?: string;\n}\n\n/**\n * A task is an entry in a users inbox.\n */\nexport interface Task {\n id: string;\n // ID of the process instance that contains this task/activity\n processInstanceId: string;\n processInstanceName: string;\n taskDefinitionKey: string;\n assignee: ProcessUser;\n claimTime: Date;\n createTime: Date;\n dueDate: Date;\n description: string;\n taskMessages?: TaskMessage[];\n taskForm?: {\n schemaProperties?: string[];\n model?: any;\n data?: any;\n outcomes?: TaskOutcome[];\n };\n delegationState?: string;\n formKey: string;\n initiator: ProcessUser;\n name: string;\n owner: ProcessUser;\n parentTaskId: string;\n processDefinition: {\n id: string;\n idPrefix: string;\n name: string;\n description: string;\n };\n suspended: false;\n variables: ProcessVariable[];\n resolvedValues?: { [id: string]: string };\n attachments: string[];\n}\n\nexport interface ProcessUser {\n id: string;\n title: string;\n}\n\nexport interface TaskMessage {\n level?: string;\n type?: string;\n message: string;\n}\n\n/**\n * A task outcome is basically an action that will be rendered as a button in the\n * task form. When the button is clicked, the outcome will be triggered.\n */\nexport interface TaskOutcome {\n // the outcomes technical name (also used for translations)\n name: string;\n // Name of the variable that this outcome will write to process vars\n variable: string;\n // The vaue that this outcome will write to process vars\n value: any;\n /**\n * Optional form model. Could be the model object as well as a string (Id\n * to fetch a form model from the backend).\n *\n * If you provide a model, triggering the outcome will display/render this form\n * alongside with the tasks form. Values of all rendered forms will be put into\n * the process variables\n */\n model?: any;\n /**\n * Outcomes will be rendered as primary buttons. If you want an outcome\n * to be less prominent you could set this property to 'true'\n */\n secondary?: boolean;\n}\n\nexport interface ProcessCreatePayload extends ProcessPostPayload {\n processDefinitionKey: string;\n name?: string;\n businessKey?: string;\n returnVariables?: boolean;\n}\n// payload for post requests to the bpm backend\nexport interface ProcessPostPayload {\n variables?: ProcessVariable[];\n attachments?: string[];\n}\n","import { APP_INBOX_NAME } from './inbox.schema';\nimport { ProcessVariable } from './inbox.interface';\n\nexport class AppInboxUtils {\n /**\n * Fixes the form model by ensuring that it contains 'core' and 'data' elements.\n * If these elements are missing, they are added to the form model.\n * @param formModel The form model to be fixed.\n * @returns The fixed form model\n */\n static fixFormModel(formModel: any): any {\n if (!formModel.elements.find((e: any) => e.name === 'core')) {\n formModel.elements.push({\n name: 'core',\n type: 'o2mGroup',\n elements: [],\n });\n }\n if (!formModel.elements.find((e: any) => e.name === 'data')) {\n formModel.elements.push({\n name: 'data',\n type: 'o2mGroupStack',\n elements: [],\n });\n }\n return formModel;\n }\n\n static getIconKey(processIdPrefix: string) {\n return `${encodeURIComponent('bpm:' + processIdPrefix)}`;\n }\n\n static getIconNamespace() {\n return `io.yuuvis.app.inbox`;\n }\n\n static getVariableType(element: any): string {\n if (element.cardinality === 'multi') return 'json';\n switch (element.type) {\n case 'o2mGroup':\n case 'o2mGroupStack':\n return 'object';\n case 'o2mList':\n return 'array';\n case 'o2mTable':\n case 'table':\n return 'table';\n case 'o2mForm':\n return 'form';\n case 'datetime':\n return 'date';\n case 'decimal':\n return 'double';\n default:\n return element.type;\n }\n }\n\n static getVariableValue(formValue: any, type: string): any {\n switch (type) {\n case 'table':\n if (formValue)\n formValue.forEach((row: any) =>\n Object.keys(row).forEach((k) => {\n if (k.endsWith('_title')) {\n delete row[k];\n }\n })\n );\n return formValue;\n default:\n return formValue;\n }\n }\n\n static getProcessVariables(\n formData: unknown,\n formElements: unknown & { type: string },\n name: string\n ): ProcessVariable {\n return {\n name,\n value: AppInboxUtils.getVariableValue(formData, formElements.type),\n type: AppInboxUtils.getVariableType(formElements),\n };\n }\n}\n","\n\nexport const APP_INBOX_ID = 'io.yuuvis.app.inbox';\nexport const APP_INBOX_NAME = 'yuuvis Inbox';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAUa,MAAA,aAAa,GAAG;AAC3B,IAAA,QAAQ,EAAE,UAAU;AACpB,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,QAAQ,EAAE,UAAU;AACpB,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,IAAI,EAAE,MAAM;;;MCZD,aAAa,CAAA;AACxB;;;;;AAKG;IACH,OAAO,YAAY,CAAC,SAAc,EAAA;AAChC,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE;AAC3D,YAAA,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;AACtB,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,QAAQ,EAAE,EAAE;AACb,aAAA,CAAC;;AAEJ,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE;AAC3D,YAAA,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;AACtB,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,IAAI,EAAE,eAAe;AACrB,gBAAA,QAAQ,EAAE,EAAE;AACb,aAAA,CAAC;;AAEJ,QAAA,OAAO,SAAS;;IAGlB,OAAO,UAAU,CAAC,eAAuB,EAAA;QACvC,OAAO,CAAA,EAAG,kBAAkB,CAAC,MAAM,GAAG,eAAe,CAAC,EAAE;;AAG1D,IAAA,OAAO,gBAAgB,GAAA;AACrB,QAAA,OAAO,qBAAqB;;IAG9B,OAAO,eAAe,CAAC,OAAY,EAAA;AACjC,QAAA,IAAI,OAAO,CAAC,WAAW,KAAK,OAAO;AAAE,YAAA,OAAO,MAAM;AAClD,QAAA,QAAQ,OAAO,CAAC,IAAI;AAClB,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,eAAe;AAClB,gBAAA,OAAO,QAAQ;AACjB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,OAAO;AAChB,YAAA,KAAK,UAAU;AACf,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,OAAO;AAChB,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,QAAQ;AACjB,YAAA;gBACE,OAAO,OAAO,CAAC,IAAI;;;AAIzB,IAAA,OAAO,gBAAgB,CAAC,SAAc,EAAE,IAAY,EAAA;QAClD,QAAQ,IAAI;AACV,YAAA,KAAK,OAAO;AACV,gBAAA,IAAI,SAAS;oBACX,SAAS,CAAC,OAAO,CAAC,CAAC,GAAQ,KACzB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AAC7B,wBAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AACxB,4BAAA,OAAO,GAAG,CAAC,CAAC,CAAC;;qBAEhB,CAAC,CACH;AACH,gBAAA,OAAO,SAAS;AAClB,YAAA;AACE,gBAAA,OAAO,SAAS;;;AAItB,IAAA,OAAO,mBAAmB,CACxB,QAAiB,EACjB,YAAwC,EACxC,IAAY,EAAA;QAEZ,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC;AAClE,YAAA,IAAI,EAAE,aAAa,CAAC,eAAe,CAAC,YAAY,CAAC;SAClD;;AAEJ;;ACpFM,MAAM,YAAY,GAAG;AACrB,MAAM,cAAc,GAAG;;ACH9B;;AAEG;;;;"}
|
|
@@ -6,7 +6,7 @@ import { MatIconRegistry, MatIconModule } from '@angular/material/icon';
|
|
|
6
6
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
7
7
|
import { signalState, patchState } from '@ngrx/signals';
|
|
8
8
|
import * as i2$1 from '@yuuvis/client-core';
|
|
9
|
-
import { BackendService, ConfigService, ApiBase, ProcessAction, TranslateModule, TranslateService, DmsService, UserService, SystemService } from '@yuuvis/client-core';
|
|
9
|
+
import { BackendService, ConfigService, ApiBase, ProcessAction, TranslateModule, TranslateService, DmsService, UserService, SystemService, LocaleDatePipe } from '@yuuvis/client-core';
|
|
10
10
|
import { finalize, tap, debounceTime } from 'rxjs';
|
|
11
11
|
import { AppInboxUtils, APP_INBOX_NAME } from '@yuuvis/app-inbox/shared';
|
|
12
12
|
import * as i1$1 from '@angular/router';
|
|
@@ -139,7 +139,7 @@ class AppInboxService {
|
|
|
139
139
|
loadWorkflowIcon(type) {
|
|
140
140
|
const iconKey = this.#getIconKey(type);
|
|
141
141
|
// register workflow icon in registry
|
|
142
|
-
const uri = `${this.#configService.getApiBase(ApiBase.apiWeb, true)}/resources/icons/${iconKey}?fallback
|
|
142
|
+
const uri = `${this.#configService.getApiBase(ApiBase.apiWeb, true)}/resources/icons/${iconKey}?fallback=` + encodeURIComponent('bpm:default');
|
|
143
143
|
this.#iconRegistry.addSvgIconInNamespace(AppInboxUtils.getIconNamespace(), iconKey, this.#sanitizer.bypassSecurityTrustResourceUrl(uri));
|
|
144
144
|
this.iconsByWorkflowType[iconKey] = iconKey;
|
|
145
145
|
}
|
|
@@ -332,11 +332,11 @@ class SortComponent {
|
|
|
332
332
|
this.sortChange.emit({ sort: sort, order: order });
|
|
333
333
|
}
|
|
334
334
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SortComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
335
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: SortComponent, isStandalone: true, selector: "ymi-sort", outputs: { sortChange: "sortChange" }, ngImport: i0, template: "\n\n\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" title=\"{{ '
|
|
335
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: SortComponent, isStandalone: true, selector: "ymi-sort", outputs: { sortChange: "sortChange" }, ngImport: i0, template: "\n\n\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" title=\"{{ 'io.yuuvis.app.inbox.task.sort.title' | translate }}\">\n <mat-icon>swap_vert</mat-icon>\n </button>\n\n <mat-menu #menu=\"matMenu\">\n @for (option of sortFields(); track $index) {\n @let selected = sortForm.value[option.type] === option.value;\n <button mat-menu-item (click)=\"selectSort(option.type, option.value)\">\n <mat-icon>{{ selected ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>\n {{ option.label }}\n </button>\n @if (sortFields().length - 3 === $index) {\n <mat-divider style=\"border-top-color: var(--ymt-outline-variant)\"></mat-divider>\n }\n }\n </mat-menu>\n\n\n\n\n\n\n\n\n\n<!-- <div class=\"sort-container\">\n <button\n #sortButton\n (click)=\"toggleDialog()\"\n class=\"sort-button\"\n title=\"{{ 'io.yuuvis.app.inbox.task.sort.title' | translate }}\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"dialogOpen() ? 'true' : 'false'\"\n >\n <mat-icon>swap_vert</mat-icon>\n </button>\n\n <dialog\n #sortDialog\n popover\n id=\"sort\"\n class=\"sort-menu\"\n [style.top.px]=\"position().top\"\n [style.left.px]=\"position().left\"\n >\n <ol\n tabindex=\"0\"\n class=\"sort-group\"\n role=\"listbox\"\n aria-multiselectable=\"false\"\n >\n @for (sortKey of sorts(); track sortKey) {\n <li\n (click)=\"selectSort(sortKey)\"\n class=\"sort-item sort-group-item\"\n [class.selected]=\"isSelectedSort(sortKey)\"\n [attr.aria-selected]=\"isSelectedSort(sortKey)\"\n role=\"option\"\n tabindex=\"0\"\n >\n @if (isSelectedSort(sortKey)) {\n <div class=\"circle-icon\"></div>\n }\n <div class=\"label\">{{ cachedSorts.get(sortKey)?.translation }}</div>\n </li>\n }\n\n <div class=\"divider\"></div>\n\n <li\n class=\"sort-item sort-order-item\"\n role=\"option\"\n tabindex=\"0\"\n [class.selected]=\"sortOrder() === 'asc'\"\n (click)=\"selectOrder('asc')\"\n [attr.aria-selected]=\"sortOrder() === 'asc'\"\n >\n <div class=\"label\">\n {{ \"io.yuuvis.app.inbox.task.sort.ascending\" | translate }}\n </div>\n </li>\n\n <li\n class=\"sort-item sort-order-item\"\n role=\"option\"\n tabindex=\"0\"\n [class.selected]=\"sortOrder() === 'desc'\"\n (click)=\"selectOrder('desc')\"\n [attr.aria-selected]=\"sortOrder() === 'desc'\"\n >\n <div class=\"label\">\n {{ \"io.yuuvis.app.inbox.task.sort.descending\" | translate }}\n </div>\n </li>\n </ol>\n </dialog>\n</div> -->\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }, { kind: "component", type: MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }] });
|
|
336
336
|
}
|
|
337
337
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SortComponent, decorators: [{
|
|
338
338
|
type: Component,
|
|
339
|
-
args: [{ selector: 'ymi-sort', standalone: true, imports: [MatIconModule, MatButtonModule, MatMenuModule, TranslateModule, MatDivider], template: "\n\n\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" title=\"{{ '
|
|
339
|
+
args: [{ selector: 'ymi-sort', standalone: true, imports: [MatIconModule, MatButtonModule, MatMenuModule, TranslateModule, MatDivider], template: "\n\n\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" title=\"{{ 'io.yuuvis.app.inbox.task.sort.title' | translate }}\">\n <mat-icon>swap_vert</mat-icon>\n </button>\n\n <mat-menu #menu=\"matMenu\">\n @for (option of sortFields(); track $index) {\n @let selected = sortForm.value[option.type] === option.value;\n <button mat-menu-item (click)=\"selectSort(option.type, option.value)\">\n <mat-icon>{{ selected ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>\n {{ option.label }}\n </button>\n @if (sortFields().length - 3 === $index) {\n <mat-divider style=\"border-top-color: var(--ymt-outline-variant)\"></mat-divider>\n }\n }\n </mat-menu>\n\n\n\n\n\n\n\n\n\n<!-- <div class=\"sort-container\">\n <button\n #sortButton\n (click)=\"toggleDialog()\"\n class=\"sort-button\"\n title=\"{{ 'io.yuuvis.app.inbox.task.sort.title' | translate }}\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"dialogOpen() ? 'true' : 'false'\"\n >\n <mat-icon>swap_vert</mat-icon>\n </button>\n\n <dialog\n #sortDialog\n popover\n id=\"sort\"\n class=\"sort-menu\"\n [style.top.px]=\"position().top\"\n [style.left.px]=\"position().left\"\n >\n <ol\n tabindex=\"0\"\n class=\"sort-group\"\n role=\"listbox\"\n aria-multiselectable=\"false\"\n >\n @for (sortKey of sorts(); track sortKey) {\n <li\n (click)=\"selectSort(sortKey)\"\n class=\"sort-item sort-group-item\"\n [class.selected]=\"isSelectedSort(sortKey)\"\n [attr.aria-selected]=\"isSelectedSort(sortKey)\"\n role=\"option\"\n tabindex=\"0\"\n >\n @if (isSelectedSort(sortKey)) {\n <div class=\"circle-icon\"></div>\n }\n <div class=\"label\">{{ cachedSorts.get(sortKey)?.translation }}</div>\n </li>\n }\n\n <div class=\"divider\"></div>\n\n <li\n class=\"sort-item sort-order-item\"\n role=\"option\"\n tabindex=\"0\"\n [class.selected]=\"sortOrder() === 'asc'\"\n (click)=\"selectOrder('asc')\"\n [attr.aria-selected]=\"sortOrder() === 'asc'\"\n >\n <div class=\"label\">\n {{ \"io.yuuvis.app.inbox.task.sort.ascending\" | translate }}\n </div>\n </li>\n\n <li\n class=\"sort-item sort-order-item\"\n role=\"option\"\n tabindex=\"0\"\n [class.selected]=\"sortOrder() === 'desc'\"\n (click)=\"selectOrder('desc')\"\n [attr.aria-selected]=\"sortOrder() === 'desc'\"\n >\n <div class=\"label\">\n {{ \"io.yuuvis.app.inbox.task.sort.descending\" | translate }}\n </div>\n </li>\n </ol>\n </dialog>\n</div> -->\n" }]
|
|
340
340
|
}], ctorParameters: () => [] });
|
|
341
341
|
|
|
342
342
|
class TaskComponent {
|
|
@@ -620,7 +620,7 @@ class InboxPageComponent {
|
|
|
620
620
|
return this.#inboxService.inbox().isAssigned;
|
|
621
621
|
}
|
|
622
622
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: InboxPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
623
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: InboxPageComponent, isStandalone: true, selector: "ymi-inbox", host: { properties: { "class.pagination": "inbox().pagination" } }, viewQueries: [{ propertyName: "listElement", first: true, predicate: ListComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<mat-progress-bar\n mode=\"indeterminate\"\n [ngClass]=\"{ busy: busy() }\"\n></mat-progress-bar>\n\n<yuv-master-details\n [(detailsActive)]=\"detailsActive\"\n [layoutOptions]=\"mdLayoutOptions\"\n layoutSettingsID=\"cm.app.documents.documents-list.layout\"\n [gutterSize]=\"16\"\n>\n <ng-template #yuvMasterPane>\n <div class=\"ymt-panel list\">\n <header>\n <h1>{{ \"io.yuuvis.app.inbox.task.header.title\" | translate }}</h1>\n <ymi-sort (sortChange)=\"updateSort($event)\" />\n <div class=\"toolbar\">\n <button\n (click)=\"refresh()\"\n class=\"icon-button\"\n mat-icon-button\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.refresh.title' | translate\n }}\"\n >\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- TODO: enable again once the feature is supported on the backend side -->\n <!-- <button\n (click)=\"groupTasksByWeek()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.week.title' | translate\n }}\"\n [class.active]=\"isWeekActive\"\n >\n <mat-icon>calendar_month</mat-icon>\n </button>\n\n <button\n (click)=\"groupTasksByOverdue()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.overdue.title' | translate\n }}\"\n [class.active]=\"isOverdueActive\"\n >\n <mat-icon>schedule</mat-icon>\n </button> -->\n\n <button\n (click)=\"groupItems()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.group.title' | translate\n }}\"\n [class.active]=\"!isAssigned\"\n >\n <mat-icon>group</mat-icon>\n </button>\n </div>\n </header>\n\n <yuv-list\n (itemSelect)=\"itemSelected($event)\"\n aria-label=\"Task inbox list\"\n >\n @if (!busy()) { @for(i of tasks(); track i.id){\n <div yuvListItem class=\"list-item\">\n <div class=\"list-item__content\">\n <mat-icon\n [svgIcon]=\"getTaskIconKey(i.processDefinition.idPrefix)\"\n ></mat-icon>\n <div class=\"title\">{{ system.getLocalizedLabel(i.name) || i.name }}</div>\n <div\n class=\"description\"\n [matTooltip]=\"i.description\"\n >\n {{ i.description }}\n </div>\n <div class=\"process meta\">{{ system.getLocalizedLabel(i.processDefinition.idPrefix) || i.processDefinition.idPrefix }}</div>\n\n <time\n class=\"due meta\"\n [attr.datetime]=\"i.dueDate\"\n [class.overdue]=\"isDateOverdue(i.dueDate)\"\n >\n {{ i.dueDate ? (i.dueDate | date : \"dd/MM/yyyy\") : \"\" }}\n </time>\n </div>\n </div>\n } }\n </yuv-list>\n @let pg = inbox().pagination; @if (pg) {\n <mat-paginator\n class=\"paginator\"\n [length]=\"pg?.total\"\n [pageSize]=\"inboxPageSize\"\n aria-label=\"Select page\"\n (page)=\"changePage($event)\"\n hidePageSize\n >\n </mat-paginator>\n }\n </div>\n </ng-template>\n <ng-template #yuvDetailsPane>\n <div class=\"ymt-panel details\">\n @if (task() && !busy()) {\n <ymi-task [task]=\"task()\" (taskFinished)=\"onTaskFinished()\"></ymi-task>\n } @else {\n <div class=\"empty\">\n <p>\n {{ \"io.yuuvis.app.inbox.task.details.empty\" | translate }}\n </p>\n </div>\n }\n </div>\n </ng-template>\n</yuv-master-details>\n", styles: [":host yuv-master-details{height:100%;padding:var(--ymt-spacing-m)}:host .ymt-panel{height:100%;overflow:hidden}:host .empty{height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center}:host .empty p{margin:var(--ymt-spacing-m);max-width:42ch;text-align:center;color:var(--ymv-text-color-subtle)}:host mat-paginator{border-block-start:1px solid var(--ymt-outline-variant)}:host mat-progress-bar{position:absolute;opacity:0;left:0;right:0}:host mat-progress-bar.busy{opacity:1}:host .list{display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"header\" \"list\" \"paging\";height:100%}:host .list>header{grid-area:header;display:grid;border-block-end:1px solid var(--ymt-outline-variant);grid-template-columns:1fr auto;grid-template-rows:auto auto;align-items:center;grid-template-areas:\"toolbar toolbar\" \"title sort\";padding:var(--ymt-spacing-s) var(--ymt-spacing-m)}:host .list>header .toolbar{grid-area:toolbar;display:flex;flex-direction:row;align-items:center;justify-content:flex-start;margin-left:calc(var(--ymt-spacing-xs) * -1);gap:var(--ymt-spacing-s)}:host .list>header .toolbar>button.active{background-color:var(--ymt-selection-background)}:host .list>header h1{grid-area:title;font:var(--ymt-font-headline-medium)}:host .list>header ymi-sort{grid-area:sort}:host .list yuv-list{grid-area:list}:host yuv-split-view{height:100%}:host .list-item{--list-item-hover-background: var(--ymt-hover-background);--list-item-selection-background: var(--ymt-focus-background);--list-item-margin: var(--ymt-spacing-xs);background-color:transparent}:host .list-item:not(:last-child){border-block-end:1px solid var(--ymt-outline-variant)}:host .list-item__content{background-color:var(--list-item-background, transparent);padding:calc(var(--ymt-spacing-l) - var(--list-item-margin)) calc(var(--ymt-spacing-2xl) - var(--list-item-margin));transition:background-color var(--transition-duration, .1s);border-radius:var(--ymt-corner-s);margin:var(--list-item-margin);display:grid;grid-template-columns:auto 2fr 1fr;grid-template-rows:auto auto;grid-template-areas:\"icon title process\" \". description due\";align-items:baseline;row-gap:var(--ymt-spacing-s);column-gap:var(--ymt-spacing-m)}:host .list-item__content mat-icon{grid-area:icon;align-self:start}:host .list-item__content .title{grid-area:title;font:var(--ymt-font-title-small)}:host .list-item__content .description{grid-area:description;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .list-item__content .meta{justify-self:end;font:var(--ymt-font-body-subtle);color:var(--ymt-text-color-subtle)}:host .list-item__content .meta.process{grid-area:process;padding:0 var(--ymt-spacing-xs)}:host .list-item__content .meta.due{grid-area:due;padding:0 var(--ymt-spacing-xs);border-radius:var(--ymt-corner-xs)}:host .list-item__content .meta.due.overdue{background-color:var(--ymt-danger-container);color:var(--ymt-on-danger-container)}:host .list-item:hover{background-color:transparent}:host .list-item:hover .list-item__content{background-color:var(--list-item-hover-background)}:host .list-item[aria-current=true],:host .list-item[aria-selected=true]{background-color:transparent}:host .list-item[aria-current=true] .list-item__content,:host .list-item[aria-selected=true] .list-item__content{background-color:var(--list-item-selection-background)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: i1$2.DatePipe, name: "date" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: YuvSplitViewModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i5.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: ListComponent, selector: "yuv-list", inputs: ["multiselect", "selfHandleSelection", "autoSelect", "disableSelection"], outputs: ["itemSelect", "itemFocus"] }, { kind: "component", type: TaskComponent, selector: "ymi-task", inputs: ["task"], outputs: ["taskFinished"] }, { kind: "component", type: SortComponent, selector: "ymi-sort", outputs: ["sortChange"] }, { kind: "directive", type: ListItemDirective, selector: "[yuvListItem]", inputs: ["disabled", "active", "selected"] }, { kind: "component", type: YuvMasterDetailsComponent, selector: "yuv-master-details", inputs: ["detailsActive", "layoutSettingsID", "layoutOptions", "undockableDetails", "panelStyle", "gutterSize", "mode"], outputs: ["detailsActiveChange"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
|
|
623
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: InboxPageComponent, isStandalone: true, selector: "ymi-inbox", host: { properties: { "class.pagination": "inbox().pagination" } }, viewQueries: [{ propertyName: "listElement", first: true, predicate: ListComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<mat-progress-bar\n mode=\"indeterminate\"\n [ngClass]=\"{ busy: busy() }\"\n></mat-progress-bar>\n\n<yuv-master-details\n [(detailsActive)]=\"detailsActive\"\n [layoutOptions]=\"mdLayoutOptions\"\n layoutSettingsID=\"cm.app.documents.documents-list.layout\"\n [gutterSize]=\"16\"\n>\n <ng-template #yuvMasterPane>\n <div class=\"ymt-panel list\">\n <header>\n <h1>{{ \"io.yuuvis.app.inbox.task.header.title\" | translate }}</h1>\n <ymi-sort (sortChange)=\"updateSort($event)\" />\n <div class=\"toolbar\">\n <button\n (click)=\"refresh()\"\n class=\"icon-button\"\n mat-icon-button\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.refresh.title' | translate\n }}\"\n >\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- TODO: enable again once the feature is supported on the backend side -->\n <!-- <button\n (click)=\"groupTasksByWeek()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.week.title' | translate\n }}\"\n [class.active]=\"isWeekActive\"\n >\n <mat-icon>calendar_month</mat-icon>\n </button>\n\n <button\n (click)=\"groupTasksByOverdue()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.overdue.title' | translate\n }}\"\n [class.active]=\"isOverdueActive\"\n >\n <mat-icon>schedule</mat-icon>\n </button> -->\n\n <button\n (click)=\"groupItems()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{isAssigned ?\n ('io.yuuvis.app.inbox.task.header.button.group.unselected.title' | translate) :\n 'io.yuuvis.app.inbox.task.header.button.group.selected.title' | translate\n }}\"\n [class.active]=\"!isAssigned\"\n >\n <mat-icon>group</mat-icon>\n </button>\n </div>\n </header>\n\n <yuv-list\n (itemSelect)=\"itemSelected($event)\"\n aria-label=\"Task inbox list\"\n >\n @if (!busy()) { @for(i of tasks(); track i.id){\n <div yuvListItem class=\"list-item\">\n <div class=\"list-item__content\">\n <mat-icon\n [matTooltip]=\"system.getLocalizedLabel(i.processDefinition.idPrefix) || i.processDefinition.idPrefix\"\n [svgIcon]=\"getTaskIconKey(i.processDefinition.idPrefix)\"\n ></mat-icon>\n <div class=\"title\">{{ system.getLocalizedLabel(i.name) || i.name }}</div>\n <div\n class=\"subject\"\n [matTooltip]=\"i.processInstanceName\"\n >\n {{ i.processInstanceName }}\n </div>\n <div class=\"receive-date meta\">{{ i.createTime ? (i.createTime | localeDate : \"short\") : \"\" }}</div>\n @if (i.dueDate) {\n <time\n class=\"due meta\"\n [attr.datetime]=\"i.dueDate\"\n [class.overdue]=\"isDateOverdue(i.dueDate)\"\n >\n {{ 'io.yuuvis.app.inbox.task.duedate.prefix' | translate }} {{ i.dueDate | localeDate : \"short\" }}\n </time>\n }\n </div>\n </div>\n } }\n </yuv-list>\n @let pg = inbox().pagination; @if (pg) {\n <mat-paginator\n class=\"paginator\"\n [length]=\"pg?.total\"\n [pageSize]=\"inboxPageSize\"\n aria-label=\"Select page\"\n (page)=\"changePage($event)\"\n hidePageSize\n >\n </mat-paginator>\n }\n </div>\n </ng-template>\n <ng-template #yuvDetailsPane>\n <div class=\"ymt-panel details\">\n @if (task() && !busy()) {\n <ymi-task [task]=\"task()\" (taskFinished)=\"onTaskFinished()\"></ymi-task>\n } @else {\n <div class=\"empty\">\n <p>\n {{ \"io.yuuvis.app.inbox.task.details.empty\" | translate }}\n </p>\n </div>\n }\n </div>\n </ng-template>\n</yuv-master-details>\n", styles: [":host yuv-master-details{height:100%;padding:var(--ymt-spacing-m)}:host .ymt-panel{height:100%;overflow:hidden}:host .empty{height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center}:host .empty p{margin:var(--ymt-spacing-m);max-width:42ch;text-align:center;color:var(--ymv-text-color-subtle)}:host mat-paginator{border-block-start:1px solid var(--ymt-outline-variant)}:host mat-progress-bar{position:absolute;opacity:0;left:0;right:0}:host mat-progress-bar.busy{opacity:1}:host .list{display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"header\" \"list\" \"paging\";height:100%}:host .list>header{grid-area:header;display:grid;border-block-end:1px solid var(--ymt-outline-variant);grid-template-columns:1fr auto;grid-template-rows:auto auto;align-items:center;grid-template-areas:\"toolbar toolbar\" \"title sort\";padding:var(--ymt-spacing-s) var(--ymt-spacing-m)}:host .list>header .toolbar{grid-area:toolbar;display:flex;flex-direction:row;align-items:center;justify-content:flex-start;margin-left:calc(var(--ymt-spacing-xs) * -1);gap:var(--ymt-spacing-s)}:host .list>header .toolbar>button.active{background-color:var(--ymt-selection-background)}:host .list>header h1{grid-area:title;font:var(--ymt-font-headline-medium)}:host .list>header ymi-sort{grid-area:sort}:host .list yuv-list{grid-area:list}:host yuv-split-view{height:100%}:host .list-item{--list-item-hover-background: var(--ymt-hover-background);--list-item-selection-background: var(--ymt-focus-background);--list-item-margin: var(--ymt-spacing-xs);background-color:transparent}:host .list-item:not(:last-child){border-block-end:1px solid var(--ymt-outline-variant)}:host .list-item__content{background-color:var(--list-item-background, transparent);padding:calc(var(--ymt-spacing-l) - var(--list-item-margin)) calc(var(--ymt-spacing-2xl) - var(--list-item-margin));transition:background-color var(--transition-duration, .1s);border-radius:var(--ymt-corner-s);margin:var(--list-item-margin);display:grid;grid-template-columns:auto 2fr 1fr;grid-template-rows:auto auto;grid-template-areas:\"icon title receive-date\" \". subject due\";align-items:baseline;row-gap:var(--ymt-spacing-s);column-gap:var(--ymt-spacing-m)}:host .list-item__content mat-icon{grid-area:icon;align-self:start}:host .list-item__content .title{grid-area:title;font:var(--ymt-font-title-small)}:host .list-item__content .subject{grid-area:subject;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .list-item__content .meta{justify-self:end;font:var(--ymt-font-body-subtle);color:var(--ymt-text-color-subtle)}:host .list-item__content .meta.receive-date{grid-area:receive-date;padding:0 var(--ymt-spacing-xs)}:host .list-item__content .meta.due{grid-area:due;padding:0 var(--ymt-spacing-xs);border-radius:var(--ymt-corner-xs)}:host .list-item__content .meta.due.overdue{background-color:var(--ymt-danger-container);color:var(--ymt-on-danger-container)}:host .list-item:hover{background-color:transparent}:host .list-item:hover .list-item__content{background-color:var(--list-item-hover-background)}:host .list-item[aria-current=true],:host .list-item[aria-selected=true]{background-color:transparent}:host .list-item[aria-current=true] .list-item__content,:host .list-item[aria-selected=true] .list-item__content{background-color:var(--list-item-selection-background)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: YuvSplitViewModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i5.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: ListComponent, selector: "yuv-list", inputs: ["multiselect", "selfHandleSelection", "autoSelect", "disableSelection"], outputs: ["itemSelect", "itemFocus"] }, { kind: "component", type: TaskComponent, selector: "ymi-task", inputs: ["task"], outputs: ["taskFinished"] }, { kind: "component", type: SortComponent, selector: "ymi-sort", outputs: ["sortChange"] }, { kind: "directive", type: ListItemDirective, selector: "[yuvListItem]", inputs: ["disabled", "active", "selected"] }, { kind: "component", type: YuvMasterDetailsComponent, selector: "yuv-master-details", inputs: ["detailsActive", "layoutSettingsID", "layoutOptions", "undockableDetails", "panelStyle", "gutterSize", "mode"], outputs: ["detailsActiveChange"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: LocaleDatePipe, name: "localeDate" }] });
|
|
624
624
|
}
|
|
625
625
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: InboxPageComponent, decorators: [{
|
|
626
626
|
type: Component,
|
|
@@ -638,9 +638,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
638
638
|
ListItemDirective,
|
|
639
639
|
YuvMasterDetailsComponent,
|
|
640
640
|
MatTooltip,
|
|
641
|
+
LocaleDatePipe,
|
|
641
642
|
], host: {
|
|
642
643
|
'[class.pagination]': 'inbox().pagination',
|
|
643
|
-
}, template: "<mat-progress-bar\n mode=\"indeterminate\"\n [ngClass]=\"{ busy: busy() }\"\n></mat-progress-bar>\n\n<yuv-master-details\n [(detailsActive)]=\"detailsActive\"\n [layoutOptions]=\"mdLayoutOptions\"\n layoutSettingsID=\"cm.app.documents.documents-list.layout\"\n [gutterSize]=\"16\"\n>\n <ng-template #yuvMasterPane>\n <div class=\"ymt-panel list\">\n <header>\n <h1>{{ \"io.yuuvis.app.inbox.task.header.title\" | translate }}</h1>\n <ymi-sort (sortChange)=\"updateSort($event)\" />\n <div class=\"toolbar\">\n <button\n (click)=\"refresh()\"\n class=\"icon-button\"\n mat-icon-button\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.refresh.title' | translate\n }}\"\n >\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- TODO: enable again once the feature is supported on the backend side -->\n <!-- <button\n (click)=\"groupTasksByWeek()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.week.title' | translate\n }}\"\n [class.active]=\"isWeekActive\"\n >\n <mat-icon>calendar_month</mat-icon>\n </button>\n\n <button\n (click)=\"groupTasksByOverdue()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.overdue.title' | translate\n }}\"\n [class.active]=\"isOverdueActive\"\n >\n <mat-icon>schedule</mat-icon>\n </button> -->\n\n <button\n (click)=\"groupItems()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{
|
|
644
|
+
}, template: "<mat-progress-bar\n mode=\"indeterminate\"\n [ngClass]=\"{ busy: busy() }\"\n></mat-progress-bar>\n\n<yuv-master-details\n [(detailsActive)]=\"detailsActive\"\n [layoutOptions]=\"mdLayoutOptions\"\n layoutSettingsID=\"cm.app.documents.documents-list.layout\"\n [gutterSize]=\"16\"\n>\n <ng-template #yuvMasterPane>\n <div class=\"ymt-panel list\">\n <header>\n <h1>{{ \"io.yuuvis.app.inbox.task.header.title\" | translate }}</h1>\n <ymi-sort (sortChange)=\"updateSort($event)\" />\n <div class=\"toolbar\">\n <button\n (click)=\"refresh()\"\n class=\"icon-button\"\n mat-icon-button\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.refresh.title' | translate\n }}\"\n >\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- TODO: enable again once the feature is supported on the backend side -->\n <!-- <button\n (click)=\"groupTasksByWeek()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.week.title' | translate\n }}\"\n [class.active]=\"isWeekActive\"\n >\n <mat-icon>calendar_month</mat-icon>\n </button>\n\n <button\n (click)=\"groupTasksByOverdue()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.overdue.title' | translate\n }}\"\n [class.active]=\"isOverdueActive\"\n >\n <mat-icon>schedule</mat-icon>\n </button> -->\n\n <button\n (click)=\"groupItems()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{isAssigned ?\n ('io.yuuvis.app.inbox.task.header.button.group.unselected.title' | translate) :\n 'io.yuuvis.app.inbox.task.header.button.group.selected.title' | translate\n }}\"\n [class.active]=\"!isAssigned\"\n >\n <mat-icon>group</mat-icon>\n </button>\n </div>\n </header>\n\n <yuv-list\n (itemSelect)=\"itemSelected($event)\"\n aria-label=\"Task inbox list\"\n >\n @if (!busy()) { @for(i of tasks(); track i.id){\n <div yuvListItem class=\"list-item\">\n <div class=\"list-item__content\">\n <mat-icon\n [matTooltip]=\"system.getLocalizedLabel(i.processDefinition.idPrefix) || i.processDefinition.idPrefix\"\n [svgIcon]=\"getTaskIconKey(i.processDefinition.idPrefix)\"\n ></mat-icon>\n <div class=\"title\">{{ system.getLocalizedLabel(i.name) || i.name }}</div>\n <div\n class=\"subject\"\n [matTooltip]=\"i.processInstanceName\"\n >\n {{ i.processInstanceName }}\n </div>\n <div class=\"receive-date meta\">{{ i.createTime ? (i.createTime | localeDate : \"short\") : \"\" }}</div>\n @if (i.dueDate) {\n <time\n class=\"due meta\"\n [attr.datetime]=\"i.dueDate\"\n [class.overdue]=\"isDateOverdue(i.dueDate)\"\n >\n {{ 'io.yuuvis.app.inbox.task.duedate.prefix' | translate }} {{ i.dueDate | localeDate : \"short\" }}\n </time>\n }\n </div>\n </div>\n } }\n </yuv-list>\n @let pg = inbox().pagination; @if (pg) {\n <mat-paginator\n class=\"paginator\"\n [length]=\"pg?.total\"\n [pageSize]=\"inboxPageSize\"\n aria-label=\"Select page\"\n (page)=\"changePage($event)\"\n hidePageSize\n >\n </mat-paginator>\n }\n </div>\n </ng-template>\n <ng-template #yuvDetailsPane>\n <div class=\"ymt-panel details\">\n @if (task() && !busy()) {\n <ymi-task [task]=\"task()\" (taskFinished)=\"onTaskFinished()\"></ymi-task>\n } @else {\n <div class=\"empty\">\n <p>\n {{ \"io.yuuvis.app.inbox.task.details.empty\" | translate }}\n </p>\n </div>\n }\n </div>\n </ng-template>\n</yuv-master-details>\n", styles: [":host yuv-master-details{height:100%;padding:var(--ymt-spacing-m)}:host .ymt-panel{height:100%;overflow:hidden}:host .empty{height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center}:host .empty p{margin:var(--ymt-spacing-m);max-width:42ch;text-align:center;color:var(--ymv-text-color-subtle)}:host mat-paginator{border-block-start:1px solid var(--ymt-outline-variant)}:host mat-progress-bar{position:absolute;opacity:0;left:0;right:0}:host mat-progress-bar.busy{opacity:1}:host .list{display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr;grid-template-areas:\"header\" \"list\" \"paging\";height:100%}:host .list>header{grid-area:header;display:grid;border-block-end:1px solid var(--ymt-outline-variant);grid-template-columns:1fr auto;grid-template-rows:auto auto;align-items:center;grid-template-areas:\"toolbar toolbar\" \"title sort\";padding:var(--ymt-spacing-s) var(--ymt-spacing-m)}:host .list>header .toolbar{grid-area:toolbar;display:flex;flex-direction:row;align-items:center;justify-content:flex-start;margin-left:calc(var(--ymt-spacing-xs) * -1);gap:var(--ymt-spacing-s)}:host .list>header .toolbar>button.active{background-color:var(--ymt-selection-background)}:host .list>header h1{grid-area:title;font:var(--ymt-font-headline-medium)}:host .list>header ymi-sort{grid-area:sort}:host .list yuv-list{grid-area:list}:host yuv-split-view{height:100%}:host .list-item{--list-item-hover-background: var(--ymt-hover-background);--list-item-selection-background: var(--ymt-focus-background);--list-item-margin: var(--ymt-spacing-xs);background-color:transparent}:host .list-item:not(:last-child){border-block-end:1px solid var(--ymt-outline-variant)}:host .list-item__content{background-color:var(--list-item-background, transparent);padding:calc(var(--ymt-spacing-l) - var(--list-item-margin)) calc(var(--ymt-spacing-2xl) - var(--list-item-margin));transition:background-color var(--transition-duration, .1s);border-radius:var(--ymt-corner-s);margin:var(--list-item-margin);display:grid;grid-template-columns:auto 2fr 1fr;grid-template-rows:auto auto;grid-template-areas:\"icon title receive-date\" \". subject due\";align-items:baseline;row-gap:var(--ymt-spacing-s);column-gap:var(--ymt-spacing-m)}:host .list-item__content mat-icon{grid-area:icon;align-self:start}:host .list-item__content .title{grid-area:title;font:var(--ymt-font-title-small)}:host .list-item__content .subject{grid-area:subject;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .list-item__content .meta{justify-self:end;font:var(--ymt-font-body-subtle);color:var(--ymt-text-color-subtle)}:host .list-item__content .meta.receive-date{grid-area:receive-date;padding:0 var(--ymt-spacing-xs)}:host .list-item__content .meta.due{grid-area:due;padding:0 var(--ymt-spacing-xs);border-radius:var(--ymt-corner-xs)}:host .list-item__content .meta.due.overdue{background-color:var(--ymt-danger-container);color:var(--ymt-on-danger-container)}:host .list-item:hover{background-color:transparent}:host .list-item:hover .list-item__content{background-color:var(--list-item-hover-background)}:host .list-item[aria-current=true],:host .list-item[aria-selected=true]{background-color:transparent}:host .list-item[aria-current=true] .list-item__content,:host .list-item[aria-selected=true] .list-item__content{background-color:var(--list-item-selection-background)}\n"] }]
|
|
644
645
|
}] });
|
|
645
646
|
|
|
646
647
|
const AppInboxRoutes = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yuuvis-app-inbox.mjs","sources":["../../../../projects/yuuvis/app-inbox/src/lib/app-inbox.service.ts","../../../../projects/yuuvis/app-inbox/src/lib/components/search/search.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/components/search/search.component.html","../../../../projects/yuuvis/app-inbox/src/lib/app-inbox.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/app-inbox.component.html","../../../../projects/yuuvis/app-inbox/src/lib/components/sort/sort.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/components/sort/sort.component.html","../../../../projects/yuuvis/app-inbox/src/lib/components/task/task.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/components/task/task.component.html","../../../../projects/yuuvis/app-inbox/src/lib/pages/inbox/inbox.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/pages/inbox/inbox.component.html","../../../../projects/yuuvis/app-inbox/src/lib/lib.routes.ts","../../../../projects/yuuvis/app-inbox/src/yuuvis-app-inbox.ts"],"sourcesContent":["import { HttpParams } from '@angular/common/http';\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { patchState, signalState } from '@ngrx/signals';\nimport {\n ApiBase,\n BackendService,\n ConfigService,\n ProcessAction,\n ProcessPostPayload\n} from '@yuuvis/client-core';\nimport { ObjectFormOptions } from '@yuuvis/client-framework/object-form';\nimport { finalize, Observable, tap } from 'rxjs';\nimport { AppInboxUtils, InboxState, Task, TasksResponse } from '@yuuvis/app-inbox/shared';\n\ntype FilterType = 'week' | 'overdue' | 'done' | 'none';\n@Injectable({\n providedIn: 'root',\n})\nexport class AppInboxService {\n #backend = inject(BackendService);\n #iconRegistry = inject(MatIconRegistry);\n #configService = inject(ConfigService);\n readonly #sanitizer = inject(DomSanitizer);\n iconsByWorkflowType: Record<string, string> = {};\n\n PAGE_SIZE = 20;\n DEFAULT_SORT_PARAM = 'createTime,desc';\n\n busy = signal<boolean>(false);\n inbox = signalState<InboxState>({\n tasks: [],\n sort: this.DEFAULT_SORT_PARAM,\n isAssigned: true,\n });\n\n disableBriefRepresentation = signal<boolean>(false);\n startFormOptions = signal<ObjectFormOptions | null>(null);\n\n /** Active filter for UI display. 'none' disables filtering. */\n activeFilter = signal<FilterType>('none');\n\n /**\n * Triggers fetching of tasks from the backend. This will update the inbox state.\n * @param page page number to fetch. Default is 0.\n * @param includeProcessVariables Whether to include process variables in the response. Default is true.\n * @param briefRepresentation Whether to use brief representation of the task. Default is true.\n */\n fetchTasks(page = 0) {\n let p = new HttpParams()\n .set('size', this.PAGE_SIZE)\n .set('sort', this.inbox().sort)\n .set('isAssigned', this.inbox().isAssigned)\n .set('page', page)\n .set('includeProcessVariables', true)\n .set('briefRepresentation', false);\n\n const sc = this.inbox().searchConditions as Record<string, any>;\n if (sc) {\n Object.keys(sc).forEach((key) => {\n p = p.set(key, sc[key]);\n });\n }\n\n this.busy.set(true);\n this.#backend\n .get(`/bpm/inbox?${p}`)\n .pipe(finalize(() => this.busy.set(false)))\n .subscribe((res: TasksResponse) => {\n const tasks = res.objects;\n patchState(this.inbox, {\n tasks: tasks,\n pagination:\n res.totalNumItems > this.PAGE_SIZE\n ? {\n page: page + 1,\n pages: Math.ceil(res.totalNumItems / this.PAGE_SIZE),\n total: res.totalNumItems,\n }\n : undefined,\n });\n const types = Array.from(\n new Set(\n tasks.map((t: any) => t.processDefinition?.idPrefix).filter(Boolean)\n )\n );\n\n types.forEach((type) => {\n if (!this.iconsByWorkflowType[this.#getIconKey(type as string)]) {\n this.loadWorkflowIcon(type as string);\n }\n });\n });\n }\n\n #getIconKey(type: string): string {\n return AppInboxUtils.getIconKey(type);\n }\n\n getTaskIconKey(type: string): string {\n return `${AppInboxUtils.getIconNamespace()}:${this.#getIconKey(type)}`;\n }\n\n /**\n * Computed signal: filtered view of tasks for the UI,\n * always derived from the last backend-fetched list and current activeFilter.\n * Never mutates primary state.\n */\n filteredTasks = computed<Task[]>(() => {\n const tasks = this.inbox().tasks;\n switch (this.activeFilter()) {\n case 'week':\n return this.#filterByWeek(tasks);\n case 'overdue':\n return this.#filterByOverdue(tasks);\n // case 'done':\n // return this.#filterByDone(tasks);\n case 'none':\n default:\n return tasks;\n }\n });\n\n isDateOverdue(dateInput?: string | Date): boolean {\n if (!dateInput) return false;\n const due = new Date(dateInput);\n return !isNaN(due.getTime()) && due < new Date();\n }\n\n loadWorkflowIcon(type: string) {\n const iconKey = this.#getIconKey(type);\n // register workflow icon in registry\n const uri = `${this.#configService.getApiBase(\n ApiBase.apiWeb,\n true\n )}/resources/icons/${iconKey}?fallback=bpm:default`;\n this.#iconRegistry.addSvgIconInNamespace(\n AppInboxUtils.getIconNamespace(),\n iconKey,\n this.#sanitizer.bypassSecurityTrustResourceUrl(uri)\n );\n this.iconsByWorkflowType[iconKey] = iconKey;\n }\n\n applySort(sort: string, order: 'asc' | 'desc') {\n patchState(this.inbox, {\n sort: sort ? `${sort},${order}` : this.DEFAULT_SORT_PARAM,\n });\n this.fetchTasks(0);\n }\n\n searchByName(term: string) {\n patchState(this.inbox, {\n searchConditions: {\n nameLikeIgnoreCase: `%${term}%`,\n },\n });\n this.fetchTasks(0);\n }\n\n resetSearch() {\n patchState(this.inbox, {\n searchConditions: undefined,\n });\n this.fetchTasks(0);\n }\n\n /**\n * Completes a task.\n * @param taskId ID of the tasks to complete\n * @param payload Data to be send with the complete request (may contain attachments, a new subject or variables)\n */\n completeTask(taskId: string, payload?: ProcessPostPayload): Observable<any> {\n return this.#updateTask(taskId, ProcessAction.complete, payload || {});\n }\n\n /**\n * Update a task. This will update the task in the backend and trigger a refresh of the inbox.\n * @param taskId ID of the task to update\n * @param action\n * @param payload\n * @param options\n * @returns\n */\n #updateTask(\n taskId: string,\n action: string,\n payload: ProcessPostPayload,\n options?: {\n includeProcessVar: boolean;\n briefRepresentation: boolean;\n }\n ) {\n const pl = { ...payload, action: action };\n return (\n this.#backend\n // TODO: BPM-ENGINE does not support attachments\n // .put(`/bpm-engine/api/tasks/${taskId}`, pl, ApiBase.none)\n .put(`/bpm/tasks/${taskId}`, pl)\n .pipe(\n tap((_) =>\n options\n ? this.fetchTasks(this.inbox().pagination?.page || 0)\n : this.fetchTasks()\n )\n )\n );\n }\n\n /**\n * Toggles whether tasks assigned to the current user are shown, and refreshes the task list.\n */\n toggleIsAssigned(): void {\n const currentState = this.inbox().isAssigned;\n patchState(this.inbox, { isAssigned: !currentState });\n this.fetchTasks();\n }\n\n /**\n * Sets the current UI filter to 'week' or removes it if already active.\n */\n toggleIsWeek(): void {\n const isActive = this.activeFilter() === 'week';\n this.activeFilter.set(isActive ? 'none' : 'week');\n }\n\n /**\n * Sets the current UI filter to 'overdue' or removes it if already active.\n */\n toggleIsOverdue(): void {\n const isActive = this.activeFilter() === 'overdue';\n this.activeFilter.set(isActive ? 'none' : 'overdue');\n }\n\n /**\n * Returns all tasks with due dates in the current week.\n * Used internally for UI filtering only, does not mutate state.\n * @param tasks Array of Task objects.\n * @returns Filtered array of tasks due within the week.\n */\n #filterByWeek(tasks: Task[]): Task[] {\n const today = new Date();\n // End of current week (Sunday). Adapt as needed for locale.\n const endOfWeek = new Date(today);\n endOfWeek.setDate(today.getDate() + (7 - today.getDay()));\n\n return tasks.filter((task) => {\n if (!task.dueDate) return false;\n const dueDate = new Date(task.dueDate);\n return (\n !isNaN(dueDate.getTime()) && dueDate >= today && dueDate <= endOfWeek\n );\n });\n }\n\n /**\n * Returns all tasks with a due date before today (overdue).\n * Used internally for UI filtering only, does not mutate state.\n * @param tasks Array of Task objects.\n * @returns Filtered array of overdue tasks.\n */\n #filterByOverdue(tasks: Task[]): Task[] {\n const today = new Date();\n return tasks.filter((task) => {\n if (!task.dueDate) return false;\n const dueDate = new Date(task.dueDate);\n return !isNaN(dueDate.getTime()) && dueDate < today;\n });\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { AppInboxService } from '../../app-inbox.service';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { debounceTime } from 'rxjs';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\n\nimport {\n TranslateModule\n} from '@yuuvis/client-core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\n\n@Component({\n selector: 'ymi-search',\n standalone: true,\n imports: [ReactiveFormsModule, \n MatFormFieldModule,\n MatInputModule,\n MatIconModule, TranslateModule],\n templateUrl: './search.component.html',\n styleUrl: './search.component.scss',\n})\nexport class SearchComponent {\n #inboxService = inject(AppInboxService);\n\n input = new FormControl<string>('');\n\n constructor() {\n this.input.valueChanges\n .pipe(takeUntilDestroyed(), debounceTime(800))\n .subscribe((value) => {\n if (value && value.length) this.#inboxService.searchByName(value);\n else this.#inboxService.resetSearch();\n });\n }\n}\n","<mat-form-field subscriptSizing=\"dynamic\">\n <input\n matInput\n type=\"text\"\n placeholder=\"{{ 'io.yuuvis.app.inbox.task.search' | translate }}...\"\n [formControl]=\"input\"\n />\n\n <mat-icon matPrefix>search</mat-icon>\n</mat-form-field>\n","import { Component } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { TranslateModule } from '@yuuvis/client-core';\nimport { YuvClientShellModule } from '@yuuvis/client-shell';\nimport { APP_INBOX_NAME } from '@yuuvis/app-inbox/shared';\nimport { SearchComponent } from './components/search/search.component';\n\n@Component({\n selector: 'ymi-app-inbox',\n standalone: true,\n imports: [TranslateModule, RouterModule, SearchComponent, YuvClientShellModule],\n templateUrl: './app-inbox.component.html',\n styleUrls: ['./app-inbox.component.scss'],\n})\nexport class AppInboxComponent {\n appName = APP_INBOX_NAME;\n}\n","<ng-template yuvAppHeaderSlot=\"search\"><ymi-search></ymi-search></ng-template>\n<main>\n <router-outlet></router-outlet>\n</main>\n","import {\n Component,\n computed,\n inject,\n output,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { TranslateModule, TranslateService } from '@yuuvis/client-core';\nimport {MatDivider} from \"@angular/material/divider\";\n\ninterface SortOption {\n label: string;\n value: string;\n type: 'sort' | 'order';\n}\n\n@Component({\n selector: 'ymi-sort',\n standalone: true,\n imports: [MatIconModule, MatButtonModule, MatMenuModule, TranslateModule, MatDivider],\n templateUrl: './sort.component.html',\n styleUrls: ['./sort.component.scss'],\n})\nexport class SortComponent {\n private translate = inject(TranslateService);\n\n sortOptions = signal(this.#setSortOptions());\n orderOptions = signal<SortOption[]>([\n { label: 'Ascending', value: 'asc', type: 'order' },\n { label: 'Descending', value: 'desc', type: 'order' },\n ]);\n sortFields = computed(() => [...this.sortOptions(), ...this.orderOptions()]);\n sortForm: FormGroup = new FormGroup({\n sort: new FormControl<string>('', {nonNullable: true}),\n order: new FormControl<'asc' | 'desc'>('asc', { nonNullable: true }),\n });\n\n sortChange = output<{\n sort: string;\n order: 'asc' | 'desc';\n }>();\n\n constructor() {\n this.translate.onLangChange.pipe(takeUntilDestroyed()).subscribe(() => {\n this.sortOptions.set(this.#setSortOptions());\n });\n this.sortForm.valueChanges.pipe(takeUntilDestroyed()).subscribe((form) => console.log('sortForm: ', form));\n }\n\n #setSortOptions() {\n const translations: Record<string, string> = {\n createTime: this.translate.instant('io.yuuvis.app.inbox.task.sort.created'),\n description: this.translate.instant(\n 'io.yuuvis.app.inbox.task.sort.description'\n ),\n duedate: this.translate.instant('io.yuuvis.app.inbox.task.sort.duedate'),\n name: this.translate.instant(\n 'io.yuuvis.app.inbox.task.sort.taskname'\n ),\n };\n return ['createTime', 'description', 'dueDate', 'name'].map((f) => ({\n label: translations[f] || f,\n value: f,\n type: 'sort',\n }));\n }\n\n selectSort(type: string, value: string) {\n const sortCtrl = this.sortForm.get('sort');\n sortCtrl?.value === value\n ? sortCtrl?.reset()\n : this.sortForm.get(type)?.setValue(value);\n this.onSelectionChange();\n }\n\n onSelectionChange() {\n const { sort, order } = this.sortForm.value;\n this.sortChange.emit({ sort: sort as string, order: order });\n }\n}\n","\n\n\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" title=\"{{ 'yuv.app.drive.sort.tooltip' | translate }}\">\n <mat-icon>swap_vert</mat-icon>\n </button>\n\n <mat-menu #menu=\"matMenu\">\n @for (option of sortFields(); track $index) {\n @let selected = sortForm.value[option.type] === option.value;\n <button mat-menu-item (click)=\"selectSort(option.type, option.value)\">\n <mat-icon>{{ selected ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>\n {{ option.label }}\n </button>\n @if (sortFields().length - 3 === $index) {\n <mat-divider style=\"border-top-color: var(--ymt-outline-variant)\"></mat-divider>\n }\n }\n </mat-menu>\n \n\n\n\n\n\n\n\n\n<!-- <div class=\"sort-container\">\n <button\n #sortButton\n (click)=\"toggleDialog()\"\n class=\"sort-button\"\n title=\"{{ 'io.yuuvis.app.inbox.task.sort.title' | translate }}\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"dialogOpen() ? 'true' : 'false'\"\n >\n <mat-icon>swap_vert</mat-icon>\n </button>\n\n <dialog\n #sortDialog\n popover\n id=\"sort\"\n class=\"sort-menu\"\n [style.top.px]=\"position().top\"\n [style.left.px]=\"position().left\"\n >\n <ol\n tabindex=\"0\"\n class=\"sort-group\"\n role=\"listbox\"\n aria-multiselectable=\"false\"\n >\n @for (sortKey of sorts(); track sortKey) {\n <li\n (click)=\"selectSort(sortKey)\"\n class=\"sort-item sort-group-item\"\n [class.selected]=\"isSelectedSort(sortKey)\"\n [attr.aria-selected]=\"isSelectedSort(sortKey)\"\n role=\"option\"\n tabindex=\"0\"\n >\n @if (isSelectedSort(sortKey)) {\n <div class=\"circle-icon\"></div>\n }\n <div class=\"label\">{{ cachedSorts.get(sortKey)?.translation }}</div>\n </li>\n }\n\n <div class=\"divider\"></div>\n\n <li\n class=\"sort-item sort-order-item\"\n role=\"option\"\n tabindex=\"0\"\n [class.selected]=\"sortOrder() === 'asc'\"\n (click)=\"selectOrder('asc')\"\n [attr.aria-selected]=\"sortOrder() === 'asc'\"\n >\n <div class=\"label\">\n {{ \"io.yuuvis.app.inbox.task.sort.ascending\" | translate }}\n </div>\n </li>\n\n <li\n class=\"sort-item sort-order-item\"\n role=\"option\"\n tabindex=\"0\"\n [class.selected]=\"sortOrder() === 'desc'\"\n (click)=\"selectOrder('desc')\"\n [attr.aria-selected]=\"sortOrder() === 'desc'\"\n >\n <div class=\"label\">\n {{ \"io.yuuvis.app.inbox.task.sort.descending\" | translate }}\n </div>\n </li>\n </ol>\n </dialog>\n</div> -->\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { AppInboxService } from '../../app-inbox.service';\nimport {\n BackendService,\n DmsObject,\n DmsService,\n FlavoredDmsObject,\n ProcessVariable,\n TranslateModule,\n TranslateService,\n UserService,\n} from '@yuuvis/client-core';\nimport { ObjectMetadataComponent } from '@yuuvis/client-framework/object-details';\nimport {\n FormStatusChangedEvent,\n ObjectFormComponent,\n ObjectFormOptions,\n} from '@yuuvis/client-framework/object-form';\nimport { ObjectPreviewComponent } from '@yuuvis/client-framework/object-preview';\nimport { YuvSplitViewModule } from '@yuuvis/client-framework/split-view';\nimport { ShellService } from '@yuuvis/client-shell-core';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { finalize } from 'rxjs';\nimport { AppInboxUtils, Task } from '@yuuvis/app-inbox/shared';\n\n@Component({\n selector: 'ymi-task',\n standalone: true,\n imports: [\n CommonModule,\n TranslateModule,\n YuvSplitViewModule,\n MatTabsModule,\n MatProgressBar,\n ObjectPreviewComponent,\n ObjectFormComponent,\n ObjectMetadataComponent,\n YmtButtonDirective,\n ],\n templateUrl: './task.component.html',\n styleUrl: './task.component.scss',\n})\nexport class TaskComponent {\n task = input<Task | null>(null);\n #backend = inject(BackendService);\n #shellService = inject(ShellService);\n #dmsService = inject(DmsService);\n #userService = inject(UserService);\n #inboxService = inject(AppInboxService);\n translate = inject(TranslateService);\n\n taskForm = viewChild(ObjectFormComponent);\n\n taskFinished = output<void>();\n\n dmsObject = signal<DmsObject | undefined>(undefined);\n #taskEffect = effect(() => {\n const task = this.task();\n if (task) {\n const formData = this.#getFormDataFromProcessVars(task);\n untracked(() => {\n if (task && task.taskForm) {\n this.startFormOptions.set({\n formModel: AppInboxUtils.fixFormModel(task.taskForm.model),\n data: formData,\n });\n } else {\n this.startFormOptions.set(null);\n }\n });\n } else {\n this.startFormOptions.set(null);\n }\n });\n\n startFormOptions = signal<ObjectFormOptions | null>(null);\n busy = signal<boolean>(false);\n disableControls = signal<boolean>(false);\n\n hasAttachments = computed(() => {\n const task = this.task();\n const attachmentId = task?.attachments?.[0] ?? '';\n if (attachmentId) {\n this.#dmsService.getDmsObject(attachmentId).subscribe({\n next: (dmsObject) => {\n this.dmsObject.set(dmsObject);\n },\n error: (err) => {\n console.error('Failed to load DMS object:', err);\n },\n });\n }\n return (task && task.attachments?.length > 0) || false;\n });\n\n onIndexdataSaved(updatedObject: any) {\n this.dmsObject = updatedObject;\n }\n\n onFormStatusChanged(evt: FormStatusChangedEvent) {\n this.disableControls.set(evt.invalid);\n }\n\n finishTask() {\n const task = this.task();\n if (!task) return;\n const assignee = task.assignee;\n const variables: ProcessVariable[] = [];\n\n const taskForm = this.taskForm();\n if (taskForm) {\n const formData: Record<string, unknown> = taskForm.getFormData();\n Object.keys(formData).forEach((key) =>\n variables.push({\n name: key,\n value: formData[key],\n })\n );\n }\n\n const attachments = task.attachments ? [task.attachments[0]] : [];\n const payload: any = {\n assignee: assignee,\n subject: task.name,\n attachments,\n variables,\n };\n this.busy.set(true);\n payload.jsonPayload = JSON.stringify(payload);\n\n this.#inboxService\n .completeTask(task.id, payload)\n .pipe(\n finalize(() => {\n this.busy.set(false);\n setTimeout(() => {\n this.taskFinished.emit();\n }, 0);\n })\n )\n .subscribe();\n }\n\n flavoredDmsObject = computed<FlavoredDmsObject | undefined>((): any => {\n const o = this.dmsObject();\n return o\n ? {\n object: o,\n flavors: [...this.#shellService.getAppliedObjectFlavors(o).applied],\n }\n : undefined;\n });\n\n #getFormDataFromProcessVars(t: Task) {\n const formData: any = {};\n if (t.variables) {\n t.variables.forEach((v: any) => {\n const value = v.value;\n if (\n value &&\n Array.isArray(value) &&\n v.type === 'json' &&\n t.resolvedValues\n ) {\n value.forEach((row) =>\n Object.keys(row).forEach((k) => {\n const resValue = t.resolvedValues?.[row[k]];\n if (!!resValue) {\n row[`${k}_title`] = resValue;\n }\n })\n );\n }\n formData[v.name] = value;\n });\n }\n return formData;\n }\n\n handleTask(taskId: string, action: string): void {\n const currentUserId = this.#userService.getCurrentUser().id;\n const payload: any = {\n action: 'claim',\n assignee: action === 'accept' ? { id: currentUserId } : null,\n };\n\n this.#backend.put(`/bpm/tasks/${taskId}`, payload).subscribe({\n next: () => {\n this.taskFinished.emit();\n },\n error: (err) => {\n console.error('Error while handling task:', err);\n },\n });\n }\n}\n","@let t = task();\n@let sfo = startFormOptions();\n@if (t) {\n\n<!-- task details and the attached object -->\n<yuv-split-view [gutterSize]=\"1\">\n <ng-template yuvSplitArea [size]=\"40\">\n <div class=\"details-pane\">\n <mat-tab-group>\n <mat-tab [label]=\"'io.yuuvis.app.inbox.task.form.title' | translate\">\n <div class=\"task-form\">\n <mat-progress-bar\n mode=\"indeterminate\"\n [ngClass]=\"{ busy: busy() }\"\n ></mat-progress-bar>\n\n @if(sfo) {\n <div class=\"form\">\n <yuv-object-form\n [formOptions]=\"sfo\"\n (statusChanged)=\"onFormStatusChanged($event)\"\n ></yuv-object-form>\n </div>\n }\n </div>\n </mat-tab>\n @if (t.attachments) {\n <mat-tab\n [label]=\"\n 'io.yuuvis.app.inbox.task.details.tab.label.metadata' | translate\n \"\n >\n <yuv-object-metadata\n [flavoredDmsObject]=\"flavoredDmsObject()\"\n (indexDataSaved)=\"onIndexdataSaved($event)\"\n >\n </yuv-object-metadata>\n </mat-tab>\n }\n </mat-tab-group>\n\n <footer>\n @if (!task()?.assignee) {\n <!-- claim a task -->\n <button\n ymtButton=\"primary\"\n (click)=\"handleTask(task()?.id || '', 'accept')\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.accept\" | translate }}\n </button>\n } @else if (task()?.assignee && task()?.claimTime) {\n <!-- return a claimed task -->\n <button\n ymtButton=\"primary\"\n (click)=\"handleTask(task()?.id || '', 'return')\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.return\" | translate }}\n </button>\n } @else{\n <button\n ymtButton=\"primary\"\n [disabled]=\"disableControls() || busy()\"\n (click)=\"finishTask()\"\n >\n {{ \"io.yuuvis.app.inbox.task.form.finish\" | translate }}</button\n >}\n </footer>\n </div>\n </ng-template>\n\n <!-- attached object -->\n <ng-template yuvSplitArea [size]=\"60\" [visible]=\"hasAttachments()\">\n @if (t.attachments) {\n <yuv-object-preview [objectId]=\"t.attachments[0]\"></yuv-object-preview>\n }\n </ng-template>\n</yuv-split-view>\n\n} @else {\n <div class=\"empty\">\n <p>{{ \"io.yuuvis.app.inbox.task.details.empty\" | translate }}</p>\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n effect,\n inject,\n OnInit,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { AppInboxService } from '../../app-inbox.service';\nimport { SystemService, TranslateModule, TranslateService } from '@yuuvis/client-core';\nimport {\n ListComponent,\n ListItemDirective,\n} from '@yuuvis/client-framework/list';\nimport { YuvSplitViewModule } from '@yuuvis/client-framework/split-view';\nimport { SortComponent } from '../../components/sort/sort.component';\nimport { TaskComponent } from '../../components/task/task.component';\nimport { Task } from '@yuuvis/app-inbox/shared';\nimport {MasterDetailsLayoutOptions, YuvMasterDetailsComponent} from \"@yuuvis/client-framework/master-details\";\n@Component({\n selector: 'ymi-inbox',\n standalone: true,\n imports: [\n CommonModule,\n TranslateModule,\n YuvSplitViewModule,\n MatIconModule,\n MatButtonModule,\n MatPaginatorModule,\n MatProgressBar,\n ListComponent,\n TaskComponent,\n SortComponent,\n ListItemDirective,\n YuvMasterDetailsComponent,\n MatTooltip,\n ],\n templateUrl: './inbox.component.html',\n styleUrl: './inbox.component.scss',\n host: {\n '[class.pagination]': 'inbox().pagination',\n },\n})\nexport class InboxPageComponent implements OnInit {\n readonly #inboxService = inject(AppInboxService);\n readonly translate = inject(TranslateService);\n readonly system = inject(SystemService)\n \n detailsActive = true;\n mdLayoutOptions: MasterDetailsLayoutOptions = {\n masterSize: 33,\n masterMinSize: undefined,\n detailsSize: 67,\n detailsMinSize: undefined,\n resizable: true\n };\n \n inboxPageSize = this.#inboxService.PAGE_SIZE\n\n /** Signals for data and state */\n inbox = this.#inboxService.inbox;\n tasks = this.#inboxService.filteredTasks;\n busy = this.#inboxService.busy;\n selectedSort = signal<string>('created');\n sortOrder = signal<'asc' | 'desc'>('desc');\n task = signal<Task | null>(null);\n\n listElement = viewChild.required<ListComponent>(ListComponent);\n iconsByWorkflowType = this.#inboxService.iconsByWorkflowType;\n #inboxEffect = effect(() => {\n const tasks = this.tasks() ?? [];\n untracked(() => {\n const previousIndex = this.selectedIndex();\n const tasksCount = tasks.length;\n\n let newIndex = -1;\n\n if (tasksCount === 0) {\n newIndex = -1;\n } else if (previousIndex < tasksCount) {\n newIndex = previousIndex;\n } else if (previousIndex >= tasksCount) {\n newIndex = previousIndex - 1;\n if (newIndex < 0) {\n newIndex = 0;\n }\n }\n this.task.set(null);\n this.selectedIndex.set(-1);\n this.itemSelected([newIndex]);\n });\n });\n\n selectedIndex = signal<number>(-1);\n\n itemSelected(idx: number[]) {\n const tasks = this.tasks() ?? [];\n const selectedIdx = idx[0];\n\n if (selectedIdx >= 0 && selectedIdx < tasks.length) {\n this.selectedIndex.set(selectedIdx);\n this.task.set(tasks[selectedIdx]);\n } else {\n this.selectedIndex.set(-1);\n this.task.set(null);\n }\n }\n\n getTaskIconKey(type: string): string {\n return this.#inboxService.getTaskIconKey(type);\n }\n\n changePage($event: PageEvent) {\n const { pageSize, pageIndex } = $event;\n this.goToPage(pageIndex + 1);\n }\n\n goToPage(page: number) {\n if (page >= 1) {\n this.#inboxService.fetchTasks(page - 1);\n }\n }\n\n /** UI filter toggles (call service) */\n groupTasksByWeek(): void {\n this.task.set(null);\n this.selectedIndex.set(-1);\n this.#inboxService.toggleIsWeek();\n }\n\n groupTasksByOverdue(): void {\n this.task.set(null);\n this.selectedIndex.set(-1);\n this.#inboxService.toggleIsOverdue();\n }\n\n // groupTasksByDone(): void {\n // this.#inboxService.toggleIsDone();\n // }\n\n onTaskFinished() {\n this.task.set(null);\n this.selectedIndex.set(-1);\n this.#inboxService.fetchTasks();\n }\n\n groupItems(): void {\n this.task.set(null);\n this.selectedIndex.set(-1);\n this.#inboxService.toggleIsAssigned();\n }\n\n /**\n * Updates sort field and direction.\n * @param sort Sorting field.\n * @param order Sort direction.\n */\n updateSort({ sort, order }: { sort: string; order: 'asc' | 'desc' }) {\n this.selectedSort.set(sort);\n this.sortOrder.set(order);\n this.#inboxService.applySort(sort, order);\n }\n\n /**\n * Triggers a debounced fetch from backend (refresh button).\n */\n refresh(): void {\n this.#inboxService.fetchTasks();\n }\n\n isDateOverdue(dateInput?: string | Date): boolean {\n return this.#inboxService.isDateOverdue(dateInput);\n }\n\n\n ngOnInit(): void {\n this.#inboxService.fetchTasks();\n }\n\n /** UI filter state getters for button highlighting */\n get isWeekActive(): boolean {\n return this.#inboxService.activeFilter() === 'week';\n }\n\n get isOverdueActive(): boolean {\n return this.#inboxService.activeFilter() === 'overdue';\n }\n\n get isDoneActive(): boolean {\n return this.#inboxService.activeFilter() === 'done';\n }\n\n get isAssigned(): boolean {\n return this.#inboxService.inbox().isAssigned;\n }\n}\n","<mat-progress-bar\n mode=\"indeterminate\"\n [ngClass]=\"{ busy: busy() }\"\n></mat-progress-bar>\n\n<yuv-master-details\n [(detailsActive)]=\"detailsActive\"\n [layoutOptions]=\"mdLayoutOptions\"\n layoutSettingsID=\"cm.app.documents.documents-list.layout\"\n [gutterSize]=\"16\"\n>\n <ng-template #yuvMasterPane>\n <div class=\"ymt-panel list\">\n <header>\n <h1>{{ \"io.yuuvis.app.inbox.task.header.title\" | translate }}</h1>\n <ymi-sort (sortChange)=\"updateSort($event)\" />\n <div class=\"toolbar\">\n <button\n (click)=\"refresh()\"\n class=\"icon-button\"\n mat-icon-button\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.refresh.title' | translate\n }}\"\n >\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- TODO: enable again once the feature is supported on the backend side -->\n <!-- <button\n (click)=\"groupTasksByWeek()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.week.title' | translate\n }}\"\n [class.active]=\"isWeekActive\"\n >\n <mat-icon>calendar_month</mat-icon>\n </button>\n\n <button\n (click)=\"groupTasksByOverdue()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.overdue.title' | translate\n }}\"\n [class.active]=\"isOverdueActive\"\n >\n <mat-icon>schedule</mat-icon>\n </button> -->\n\n <button\n (click)=\"groupItems()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.group.title' | translate\n }}\"\n [class.active]=\"!isAssigned\"\n >\n <mat-icon>group</mat-icon>\n </button>\n </div>\n </header>\n\n <yuv-list\n (itemSelect)=\"itemSelected($event)\"\n aria-label=\"Task inbox list\"\n >\n @if (!busy()) { @for(i of tasks(); track i.id){\n <div yuvListItem class=\"list-item\">\n <div class=\"list-item__content\">\n <mat-icon\n [svgIcon]=\"getTaskIconKey(i.processDefinition.idPrefix)\"\n ></mat-icon>\n <div class=\"title\">{{ system.getLocalizedLabel(i.name) || i.name }}</div>\n <div\n class=\"description\"\n [matTooltip]=\"i.description\"\n >\n {{ i.description }}\n </div>\n <div class=\"process meta\">{{ system.getLocalizedLabel(i.processDefinition.idPrefix) || i.processDefinition.idPrefix }}</div>\n\n <time\n class=\"due meta\"\n [attr.datetime]=\"i.dueDate\"\n [class.overdue]=\"isDateOverdue(i.dueDate)\"\n >\n {{ i.dueDate ? (i.dueDate | date : \"dd/MM/yyyy\") : \"\" }}\n </time>\n </div>\n </div>\n } }\n </yuv-list>\n @let pg = inbox().pagination; @if (pg) {\n <mat-paginator\n class=\"paginator\"\n [length]=\"pg?.total\"\n [pageSize]=\"inboxPageSize\"\n aria-label=\"Select page\"\n (page)=\"changePage($event)\"\n hidePageSize\n >\n </mat-paginator>\n }\n </div>\n </ng-template>\n <ng-template #yuvDetailsPane>\n <div class=\"ymt-panel details\">\n @if (task() && !busy()) {\n <ymi-task [task]=\"task()\" (taskFinished)=\"onTaskFinished()\"></ymi-task>\n } @else {\n <div class=\"empty\">\n <p>\n {{ \"io.yuuvis.app.inbox.task.details.empty\" | translate }}\n </p>\n </div>\n }\n </div>\n </ng-template>\n</yuv-master-details>\n","import { Route } from '@angular/router';\nimport { AppInboxComponent } from './app-inbox.component';\nimport { InboxPageComponent } from './pages/inbox/inbox.component';\n\nexport const AppInboxRoutes: Route[] = [\n {\n path: '',\n component: AppInboxComponent,\n children: [\n { path: 'inbox', component: InboxPageComponent},\n { path: '', redirectTo: 'inbox', pathMatch: 'full' }\n ]\n },\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i5","i1","i2","i3","i4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"yuuvis-app-inbox.mjs","sources":["../../../../projects/yuuvis/app-inbox/src/lib/app-inbox.service.ts","../../../../projects/yuuvis/app-inbox/src/lib/components/search/search.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/components/search/search.component.html","../../../../projects/yuuvis/app-inbox/src/lib/app-inbox.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/app-inbox.component.html","../../../../projects/yuuvis/app-inbox/src/lib/components/sort/sort.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/components/sort/sort.component.html","../../../../projects/yuuvis/app-inbox/src/lib/components/task/task.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/components/task/task.component.html","../../../../projects/yuuvis/app-inbox/src/lib/pages/inbox/inbox.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/pages/inbox/inbox.component.html","../../../../projects/yuuvis/app-inbox/src/lib/lib.routes.ts","../../../../projects/yuuvis/app-inbox/src/yuuvis-app-inbox.ts"],"sourcesContent":["import { HttpParams } from '@angular/common/http';\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { patchState, signalState } from '@ngrx/signals';\nimport {\n ApiBase,\n BackendService,\n ConfigService,\n ProcessAction,\n ProcessPostPayload\n} from '@yuuvis/client-core';\nimport { ObjectFormOptions } from '@yuuvis/client-framework/object-form';\nimport { finalize, Observable, tap } from 'rxjs';\nimport { AppInboxUtils, InboxState, Task, TasksResponse } from '@yuuvis/app-inbox/shared';\n\ntype FilterType = 'week' | 'overdue' | 'done' | 'none';\n@Injectable({\n providedIn: 'root',\n})\nexport class AppInboxService {\n #backend = inject(BackendService);\n #iconRegistry = inject(MatIconRegistry);\n #configService = inject(ConfigService);\n readonly #sanitizer = inject(DomSanitizer);\n iconsByWorkflowType: Record<string, string> = {};\n\n PAGE_SIZE = 20;\n DEFAULT_SORT_PARAM = 'createTime,desc';\n\n busy = signal<boolean>(false);\n inbox = signalState<InboxState>({\n tasks: [],\n sort: this.DEFAULT_SORT_PARAM,\n isAssigned: true,\n });\n\n disableBriefRepresentation = signal<boolean>(false);\n startFormOptions = signal<ObjectFormOptions | null>(null);\n\n /** Active filter for UI display. 'none' disables filtering. */\n activeFilter = signal<FilterType>('none');\n\n /**\n * Triggers fetching of tasks from the backend. This will update the inbox state.\n * @param page page number to fetch. Default is 0.\n * @param includeProcessVariables Whether to include process variables in the response. Default is true.\n * @param briefRepresentation Whether to use brief representation of the task. Default is true.\n */\n fetchTasks(page = 0) {\n let p = new HttpParams()\n .set('size', this.PAGE_SIZE)\n .set('sort', this.inbox().sort)\n .set('isAssigned', this.inbox().isAssigned)\n .set('page', page)\n .set('includeProcessVariables', true)\n .set('briefRepresentation', false);\n\n const sc = this.inbox().searchConditions as Record<string, any>;\n if (sc) {\n Object.keys(sc).forEach((key) => {\n p = p.set(key, sc[key]);\n });\n }\n\n this.busy.set(true);\n this.#backend\n .get(`/bpm/inbox?${p}`)\n .pipe(finalize(() => this.busy.set(false)))\n .subscribe((res: TasksResponse) => {\n const tasks = res.objects;\n patchState(this.inbox, {\n tasks: tasks,\n pagination:\n res.totalNumItems > this.PAGE_SIZE\n ? {\n page: page + 1,\n pages: Math.ceil(res.totalNumItems / this.PAGE_SIZE),\n total: res.totalNumItems,\n }\n : undefined,\n });\n const types = Array.from(\n new Set(\n tasks.map((t: any) => t.processDefinition?.idPrefix).filter(Boolean)\n )\n );\n\n types.forEach((type) => {\n if (!this.iconsByWorkflowType[this.#getIconKey(type as string)]) {\n this.loadWorkflowIcon(type as string);\n }\n });\n });\n }\n\n #getIconKey(type: string): string {\n return AppInboxUtils.getIconKey(type);\n }\n\n getTaskIconKey(type: string): string {\n return `${AppInboxUtils.getIconNamespace()}:${this.#getIconKey(type)}`;\n }\n\n /**\n * Computed signal: filtered view of tasks for the UI,\n * always derived from the last backend-fetched list and current activeFilter.\n * Never mutates primary state.\n */\n filteredTasks = computed<Task[]>(() => {\n const tasks = this.inbox().tasks;\n switch (this.activeFilter()) {\n case 'week':\n return this.#filterByWeek(tasks);\n case 'overdue':\n return this.#filterByOverdue(tasks);\n // case 'done':\n // return this.#filterByDone(tasks);\n case 'none':\n default:\n return tasks;\n }\n });\n\n isDateOverdue(dateInput?: string | Date): boolean {\n if (!dateInput) return false;\n const due = new Date(dateInput);\n return !isNaN(due.getTime()) && due < new Date();\n }\n\n loadWorkflowIcon(type: string) {\n const iconKey = this.#getIconKey(type);\n // register workflow icon in registry\n const uri = `${this.#configService.getApiBase(\n ApiBase.apiWeb,\n true\n )}/resources/icons/${iconKey}?fallback=` + encodeURIComponent('bpm:default');\n this.#iconRegistry.addSvgIconInNamespace(\n AppInboxUtils.getIconNamespace(),\n iconKey,\n this.#sanitizer.bypassSecurityTrustResourceUrl(uri)\n );\n this.iconsByWorkflowType[iconKey] = iconKey;\n }\n\n applySort(sort: string, order: 'asc' | 'desc') {\n patchState(this.inbox, {\n sort: sort ? `${sort},${order}` : this.DEFAULT_SORT_PARAM,\n });\n this.fetchTasks(0);\n }\n\n searchByName(term: string) {\n patchState(this.inbox, {\n searchConditions: {\n nameLikeIgnoreCase: `%${term}%`,\n },\n });\n this.fetchTasks(0);\n }\n\n resetSearch() {\n patchState(this.inbox, {\n searchConditions: undefined,\n });\n this.fetchTasks(0);\n }\n\n /**\n * Completes a task.\n * @param taskId ID of the tasks to complete\n * @param payload Data to be send with the complete request (may contain attachments, a new subject or variables)\n */\n completeTask(taskId: string, payload?: ProcessPostPayload): Observable<any> {\n return this.#updateTask(taskId, ProcessAction.complete, payload || {});\n }\n\n /**\n * Update a task. This will update the task in the backend and trigger a refresh of the inbox.\n * @param taskId ID of the task to update\n * @param action\n * @param payload\n * @param options\n * @returns\n */\n #updateTask(\n taskId: string,\n action: string,\n payload: ProcessPostPayload,\n options?: {\n includeProcessVar: boolean;\n briefRepresentation: boolean;\n }\n ) {\n const pl = { ...payload, action: action };\n return (\n this.#backend\n // TODO: BPM-ENGINE does not support attachments\n // .put(`/bpm-engine/api/tasks/${taskId}`, pl, ApiBase.none)\n .put(`/bpm/tasks/${taskId}`, pl)\n .pipe(\n tap((_) =>\n options\n ? this.fetchTasks(this.inbox().pagination?.page || 0)\n : this.fetchTasks()\n )\n )\n );\n }\n\n /**\n * Toggles whether tasks assigned to the current user are shown, and refreshes the task list.\n */\n toggleIsAssigned(): void {\n const currentState = this.inbox().isAssigned;\n patchState(this.inbox, { isAssigned: !currentState });\n this.fetchTasks();\n }\n\n /**\n * Sets the current UI filter to 'week' or removes it if already active.\n */\n toggleIsWeek(): void {\n const isActive = this.activeFilter() === 'week';\n this.activeFilter.set(isActive ? 'none' : 'week');\n }\n\n /**\n * Sets the current UI filter to 'overdue' or removes it if already active.\n */\n toggleIsOverdue(): void {\n const isActive = this.activeFilter() === 'overdue';\n this.activeFilter.set(isActive ? 'none' : 'overdue');\n }\n\n /**\n * Returns all tasks with due dates in the current week.\n * Used internally for UI filtering only, does not mutate state.\n * @param tasks Array of Task objects.\n * @returns Filtered array of tasks due within the week.\n */\n #filterByWeek(tasks: Task[]): Task[] {\n const today = new Date();\n // End of current week (Sunday). Adapt as needed for locale.\n const endOfWeek = new Date(today);\n endOfWeek.setDate(today.getDate() + (7 - today.getDay()));\n\n return tasks.filter((task) => {\n if (!task.dueDate) return false;\n const dueDate = new Date(task.dueDate);\n return (\n !isNaN(dueDate.getTime()) && dueDate >= today && dueDate <= endOfWeek\n );\n });\n }\n\n /**\n * Returns all tasks with a due date before today (overdue).\n * Used internally for UI filtering only, does not mutate state.\n * @param tasks Array of Task objects.\n * @returns Filtered array of overdue tasks.\n */\n #filterByOverdue(tasks: Task[]): Task[] {\n const today = new Date();\n return tasks.filter((task) => {\n if (!task.dueDate) return false;\n const dueDate = new Date(task.dueDate);\n return !isNaN(dueDate.getTime()) && dueDate < today;\n });\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { AppInboxService } from '../../app-inbox.service';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { debounceTime } from 'rxjs';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\n\nimport {\n TranslateModule\n} from '@yuuvis/client-core';\nimport { MatFormFieldModule } from '@angular/material/form-field';\n\n@Component({\n selector: 'ymi-search',\n standalone: true,\n imports: [ReactiveFormsModule, \n MatFormFieldModule,\n MatInputModule,\n MatIconModule, TranslateModule],\n templateUrl: './search.component.html',\n styleUrl: './search.component.scss',\n})\nexport class SearchComponent {\n #inboxService = inject(AppInboxService);\n\n input = new FormControl<string>('');\n\n constructor() {\n this.input.valueChanges\n .pipe(takeUntilDestroyed(), debounceTime(800))\n .subscribe((value) => {\n if (value && value.length) this.#inboxService.searchByName(value);\n else this.#inboxService.resetSearch();\n });\n }\n}\n","<mat-form-field subscriptSizing=\"dynamic\">\n <input\n matInput\n type=\"text\"\n placeholder=\"{{ 'io.yuuvis.app.inbox.task.search' | translate }}...\"\n [formControl]=\"input\"\n />\n\n <mat-icon matPrefix>search</mat-icon>\n</mat-form-field>\n","import { Component } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { TranslateModule } from '@yuuvis/client-core';\nimport { YuvClientShellModule } from '@yuuvis/client-shell';\nimport { APP_INBOX_NAME } from '@yuuvis/app-inbox/shared';\nimport { SearchComponent } from './components/search/search.component';\n\n@Component({\n selector: 'ymi-app-inbox',\n standalone: true,\n imports: [TranslateModule, RouterModule, SearchComponent, YuvClientShellModule],\n templateUrl: './app-inbox.component.html',\n styleUrls: ['./app-inbox.component.scss'],\n})\nexport class AppInboxComponent {\n appName = APP_INBOX_NAME;\n}\n","<ng-template yuvAppHeaderSlot=\"search\"><ymi-search></ymi-search></ng-template>\n<main>\n <router-outlet></router-outlet>\n</main>\n","import {\n Component,\n computed,\n inject,\n output,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { TranslateModule, TranslateService } from '@yuuvis/client-core';\nimport {MatDivider} from \"@angular/material/divider\";\n\ninterface SortOption {\n label: string;\n value: string;\n type: 'sort' | 'order';\n}\n\n@Component({\n selector: 'ymi-sort',\n standalone: true,\n imports: [MatIconModule, MatButtonModule, MatMenuModule, TranslateModule, MatDivider],\n templateUrl: './sort.component.html',\n styleUrls: ['./sort.component.scss'],\n})\nexport class SortComponent {\n private translate = inject(TranslateService);\n\n sortOptions = signal(this.#setSortOptions());\n orderOptions = signal<SortOption[]>([\n { label: 'Ascending', value: 'asc', type: 'order' },\n { label: 'Descending', value: 'desc', type: 'order' },\n ]);\n sortFields = computed(() => [...this.sortOptions(), ...this.orderOptions()]);\n sortForm: FormGroup = new FormGroup({\n sort: new FormControl<string>('', {nonNullable: true}),\n order: new FormControl<'asc' | 'desc'>('asc', { nonNullable: true }),\n });\n\n sortChange = output<{\n sort: string;\n order: 'asc' | 'desc';\n }>();\n\n constructor() {\n this.translate.onLangChange.pipe(takeUntilDestroyed()).subscribe(() => {\n this.sortOptions.set(this.#setSortOptions());\n });\n this.sortForm.valueChanges.pipe(takeUntilDestroyed()).subscribe((form) => console.log('sortForm: ', form));\n }\n\n #setSortOptions() {\n const translations: Record<string, string> = {\n createTime: this.translate.instant('io.yuuvis.app.inbox.task.sort.created'),\n description: this.translate.instant(\n 'io.yuuvis.app.inbox.task.sort.description'\n ),\n duedate: this.translate.instant('io.yuuvis.app.inbox.task.sort.duedate'),\n name: this.translate.instant(\n 'io.yuuvis.app.inbox.task.sort.taskname'\n ),\n };\n return ['createTime', 'description', 'dueDate', 'name'].map((f) => ({\n label: translations[f] || f,\n value: f,\n type: 'sort',\n }));\n }\n\n selectSort(type: string, value: string) {\n const sortCtrl = this.sortForm.get('sort');\n sortCtrl?.value === value\n ? sortCtrl?.reset()\n : this.sortForm.get(type)?.setValue(value);\n this.onSelectionChange();\n }\n\n onSelectionChange() {\n const { sort, order } = this.sortForm.value;\n this.sortChange.emit({ sort: sort as string, order: order });\n }\n}\n","\n\n\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" title=\"{{ 'io.yuuvis.app.inbox.task.sort.title' | translate }}\">\n <mat-icon>swap_vert</mat-icon>\n </button>\n\n <mat-menu #menu=\"matMenu\">\n @for (option of sortFields(); track $index) {\n @let selected = sortForm.value[option.type] === option.value;\n <button mat-menu-item (click)=\"selectSort(option.type, option.value)\">\n <mat-icon>{{ selected ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>\n {{ option.label }}\n </button>\n @if (sortFields().length - 3 === $index) {\n <mat-divider style=\"border-top-color: var(--ymt-outline-variant)\"></mat-divider>\n }\n }\n </mat-menu>\n\n\n\n\n\n\n\n\n\n<!-- <div class=\"sort-container\">\n <button\n #sortButton\n (click)=\"toggleDialog()\"\n class=\"sort-button\"\n title=\"{{ 'io.yuuvis.app.inbox.task.sort.title' | translate }}\"\n [attr.aria-haspopup]=\"true\"\n [attr.aria-expanded]=\"dialogOpen() ? 'true' : 'false'\"\n >\n <mat-icon>swap_vert</mat-icon>\n </button>\n\n <dialog\n #sortDialog\n popover\n id=\"sort\"\n class=\"sort-menu\"\n [style.top.px]=\"position().top\"\n [style.left.px]=\"position().left\"\n >\n <ol\n tabindex=\"0\"\n class=\"sort-group\"\n role=\"listbox\"\n aria-multiselectable=\"false\"\n >\n @for (sortKey of sorts(); track sortKey) {\n <li\n (click)=\"selectSort(sortKey)\"\n class=\"sort-item sort-group-item\"\n [class.selected]=\"isSelectedSort(sortKey)\"\n [attr.aria-selected]=\"isSelectedSort(sortKey)\"\n role=\"option\"\n tabindex=\"0\"\n >\n @if (isSelectedSort(sortKey)) {\n <div class=\"circle-icon\"></div>\n }\n <div class=\"label\">{{ cachedSorts.get(sortKey)?.translation }}</div>\n </li>\n }\n\n <div class=\"divider\"></div>\n\n <li\n class=\"sort-item sort-order-item\"\n role=\"option\"\n tabindex=\"0\"\n [class.selected]=\"sortOrder() === 'asc'\"\n (click)=\"selectOrder('asc')\"\n [attr.aria-selected]=\"sortOrder() === 'asc'\"\n >\n <div class=\"label\">\n {{ \"io.yuuvis.app.inbox.task.sort.ascending\" | translate }}\n </div>\n </li>\n\n <li\n class=\"sort-item sort-order-item\"\n role=\"option\"\n tabindex=\"0\"\n [class.selected]=\"sortOrder() === 'desc'\"\n (click)=\"selectOrder('desc')\"\n [attr.aria-selected]=\"sortOrder() === 'desc'\"\n >\n <div class=\"label\">\n {{ \"io.yuuvis.app.inbox.task.sort.descending\" | translate }}\n </div>\n </li>\n </ol>\n </dialog>\n</div> -->\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild\n} from '@angular/core';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { AppInboxService } from '../../app-inbox.service';\nimport {\n BackendService,\n DmsObject,\n DmsService,\n FlavoredDmsObject,\n ProcessVariable,\n TranslateModule,\n TranslateService,\n UserService,\n} from '@yuuvis/client-core';\nimport { ObjectMetadataComponent } from '@yuuvis/client-framework/object-details';\nimport {\n FormStatusChangedEvent,\n ObjectFormComponent,\n ObjectFormOptions,\n} from '@yuuvis/client-framework/object-form';\nimport { ObjectPreviewComponent } from '@yuuvis/client-framework/object-preview';\nimport { YuvSplitViewModule } from '@yuuvis/client-framework/split-view';\nimport { ShellService } from '@yuuvis/client-shell-core';\nimport { YmtButtonDirective } from '@yuuvis/material';\nimport { finalize } from 'rxjs';\nimport { AppInboxUtils, Task } from '@yuuvis/app-inbox/shared';\n\n@Component({\n selector: 'ymi-task',\n standalone: true,\n imports: [\n CommonModule,\n TranslateModule,\n YuvSplitViewModule,\n MatTabsModule,\n MatProgressBar,\n ObjectPreviewComponent,\n ObjectFormComponent,\n ObjectMetadataComponent,\n YmtButtonDirective,\n ],\n templateUrl: './task.component.html',\n styleUrl: './task.component.scss',\n})\nexport class TaskComponent {\n task = input<Task | null>(null);\n #backend = inject(BackendService);\n #shellService = inject(ShellService);\n #dmsService = inject(DmsService);\n #userService = inject(UserService);\n #inboxService = inject(AppInboxService);\n translate = inject(TranslateService);\n\n taskForm = viewChild(ObjectFormComponent);\n\n taskFinished = output<void>();\n\n dmsObject = signal<DmsObject | undefined>(undefined);\n #taskEffect = effect(() => {\n const task = this.task();\n if (task) {\n const formData = this.#getFormDataFromProcessVars(task);\n untracked(() => {\n if (task && task.taskForm) {\n this.startFormOptions.set({\n formModel: AppInboxUtils.fixFormModel(task.taskForm.model),\n data: formData,\n });\n } else {\n this.startFormOptions.set(null);\n }\n });\n } else {\n this.startFormOptions.set(null);\n }\n });\n\n startFormOptions = signal<ObjectFormOptions | null>(null);\n busy = signal<boolean>(false);\n disableControls = signal<boolean>(false);\n\n hasAttachments = computed(() => {\n const task = this.task();\n const attachmentId = task?.attachments?.[0] ?? '';\n if (attachmentId) {\n this.#dmsService.getDmsObject(attachmentId).subscribe({\n next: (dmsObject) => {\n this.dmsObject.set(dmsObject);\n },\n error: (err) => {\n console.error('Failed to load DMS object:', err);\n },\n });\n }\n return (task && task.attachments?.length > 0) || false;\n });\n\n onIndexdataSaved(updatedObject: any) {\n this.dmsObject = updatedObject;\n }\n\n onFormStatusChanged(evt: FormStatusChangedEvent) {\n this.disableControls.set(evt.invalid);\n }\n\n finishTask() {\n const task = this.task();\n if (!task) return;\n const assignee = task.assignee;\n const variables: ProcessVariable[] = [];\n\n const taskForm = this.taskForm();\n if (taskForm) {\n const formData: Record<string, unknown> = taskForm.getFormData();\n Object.keys(formData).forEach((key) =>\n variables.push({\n name: key,\n value: formData[key],\n })\n );\n }\n\n const attachments = task.attachments ? [task.attachments[0]] : [];\n const payload: any = {\n assignee: assignee,\n subject: task.name,\n attachments,\n variables,\n };\n this.busy.set(true);\n payload.jsonPayload = JSON.stringify(payload);\n\n this.#inboxService\n .completeTask(task.id, payload)\n .pipe(\n finalize(() => {\n this.busy.set(false);\n setTimeout(() => {\n this.taskFinished.emit();\n }, 0);\n })\n )\n .subscribe();\n }\n\n flavoredDmsObject = computed<FlavoredDmsObject | undefined>((): any => {\n const o = this.dmsObject();\n return o\n ? {\n object: o,\n flavors: [...this.#shellService.getAppliedObjectFlavors(o).applied],\n }\n : undefined;\n });\n\n #getFormDataFromProcessVars(t: Task) {\n const formData: any = {};\n if (t.variables) {\n t.variables.forEach((v: any) => {\n const value = v.value;\n if (\n value &&\n Array.isArray(value) &&\n v.type === 'json' &&\n t.resolvedValues\n ) {\n value.forEach((row) =>\n Object.keys(row).forEach((k) => {\n const resValue = t.resolvedValues?.[row[k]];\n if (!!resValue) {\n row[`${k}_title`] = resValue;\n }\n })\n );\n }\n formData[v.name] = value;\n });\n }\n return formData;\n }\n\n handleTask(taskId: string, action: string): void {\n const currentUserId = this.#userService.getCurrentUser().id;\n const payload: any = {\n action: 'claim',\n assignee: action === 'accept' ? { id: currentUserId } : null,\n };\n\n this.#backend.put(`/bpm/tasks/${taskId}`, payload).subscribe({\n next: () => {\n this.taskFinished.emit();\n },\n error: (err) => {\n console.error('Error while handling task:', err);\n },\n });\n }\n}\n","@let t = task();\n@let sfo = startFormOptions();\n@if (t) {\n\n<!-- task details and the attached object -->\n<yuv-split-view [gutterSize]=\"1\">\n <ng-template yuvSplitArea [size]=\"40\">\n <div class=\"details-pane\">\n <mat-tab-group>\n <mat-tab [label]=\"'io.yuuvis.app.inbox.task.form.title' | translate\">\n <div class=\"task-form\">\n <mat-progress-bar\n mode=\"indeterminate\"\n [ngClass]=\"{ busy: busy() }\"\n ></mat-progress-bar>\n\n @if(sfo) {\n <div class=\"form\">\n <yuv-object-form\n [formOptions]=\"sfo\"\n (statusChanged)=\"onFormStatusChanged($event)\"\n ></yuv-object-form>\n </div>\n }\n </div>\n </mat-tab>\n @if (t.attachments) {\n <mat-tab\n [label]=\"\n 'io.yuuvis.app.inbox.task.details.tab.label.metadata' | translate\n \"\n >\n <yuv-object-metadata\n [flavoredDmsObject]=\"flavoredDmsObject()\"\n (indexDataSaved)=\"onIndexdataSaved($event)\"\n >\n </yuv-object-metadata>\n </mat-tab>\n }\n </mat-tab-group>\n\n <footer>\n @if (!task()?.assignee) {\n <!-- claim a task -->\n <button\n ymtButton=\"primary\"\n (click)=\"handleTask(task()?.id || '', 'accept')\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.accept\" | translate }}\n </button>\n } @else if (task()?.assignee && task()?.claimTime) {\n <!-- return a claimed task -->\n <button\n ymtButton=\"primary\"\n (click)=\"handleTask(task()?.id || '', 'return')\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.return\" | translate }}\n </button>\n } @else{\n <button\n ymtButton=\"primary\"\n [disabled]=\"disableControls() || busy()\"\n (click)=\"finishTask()\"\n >\n {{ \"io.yuuvis.app.inbox.task.form.finish\" | translate }}</button\n >}\n </footer>\n </div>\n </ng-template>\n\n <!-- attached object -->\n <ng-template yuvSplitArea [size]=\"60\" [visible]=\"hasAttachments()\">\n @if (t.attachments) {\n <yuv-object-preview [objectId]=\"t.attachments[0]\"></yuv-object-preview>\n }\n </ng-template>\n</yuv-split-view>\n\n} @else {\n <div class=\"empty\">\n <p>{{ \"io.yuuvis.app.inbox.task.details.empty\" | translate }}</p>\n </div>\n}\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n effect,\n inject,\n OnInit,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatPaginatorModule, PageEvent } from '@angular/material/paginator';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { MatTooltip } from '@angular/material/tooltip';\nimport { AppInboxService } from '../../app-inbox.service';\nimport {LocaleDatePipe, SystemService, TranslateModule, TranslateService} from '@yuuvis/client-core';\nimport {\n ListComponent,\n ListItemDirective,\n} from '@yuuvis/client-framework/list';\nimport { YuvSplitViewModule } from '@yuuvis/client-framework/split-view';\nimport { SortComponent } from '../../components/sort/sort.component';\nimport { TaskComponent } from '../../components/task/task.component';\nimport { Task } from '@yuuvis/app-inbox/shared';\nimport {MasterDetailsLayoutOptions, YuvMasterDetailsComponent} from \"@yuuvis/client-framework/master-details\";\n@Component({\n selector: 'ymi-inbox',\n standalone: true,\n imports: [\n CommonModule,\n TranslateModule,\n YuvSplitViewModule,\n MatIconModule,\n MatButtonModule,\n MatPaginatorModule,\n MatProgressBar,\n ListComponent,\n TaskComponent,\n SortComponent,\n ListItemDirective,\n YuvMasterDetailsComponent,\n MatTooltip,\n LocaleDatePipe,\n ],\n templateUrl: './inbox.component.html',\n styleUrl: './inbox.component.scss',\n host: {\n '[class.pagination]': 'inbox().pagination',\n },\n})\nexport class InboxPageComponent implements OnInit {\n readonly #inboxService = inject(AppInboxService);\n readonly translate = inject(TranslateService);\n readonly system = inject(SystemService)\n\n detailsActive = true;\n mdLayoutOptions: MasterDetailsLayoutOptions = {\n masterSize: 33,\n masterMinSize: undefined,\n detailsSize: 67,\n detailsMinSize: undefined,\n resizable: true\n };\n\n inboxPageSize = this.#inboxService.PAGE_SIZE\n\n /** Signals for data and state */\n inbox = this.#inboxService.inbox;\n tasks = this.#inboxService.filteredTasks;\n busy = this.#inboxService.busy;\n selectedSort = signal<string>('created');\n sortOrder = signal<'asc' | 'desc'>('desc');\n task = signal<Task | null>(null);\n\n listElement = viewChild.required<ListComponent>(ListComponent);\n iconsByWorkflowType = this.#inboxService.iconsByWorkflowType;\n #inboxEffect = effect(() => {\n const tasks = this.tasks() ?? [];\n untracked(() => {\n const previousIndex = this.selectedIndex();\n const tasksCount = tasks.length;\n\n let newIndex = -1;\n\n if (tasksCount === 0) {\n newIndex = -1;\n } else if (previousIndex < tasksCount) {\n newIndex = previousIndex;\n } else if (previousIndex >= tasksCount) {\n newIndex = previousIndex - 1;\n if (newIndex < 0) {\n newIndex = 0;\n }\n }\n this.task.set(null);\n this.selectedIndex.set(-1);\n this.itemSelected([newIndex]);\n });\n });\n\n selectedIndex = signal<number>(-1);\n\n itemSelected(idx: number[]) {\n const tasks = this.tasks() ?? [];\n const selectedIdx = idx[0];\n\n if (selectedIdx >= 0 && selectedIdx < tasks.length) {\n this.selectedIndex.set(selectedIdx);\n this.task.set(tasks[selectedIdx]);\n } else {\n this.selectedIndex.set(-1);\n this.task.set(null);\n }\n }\n\n getTaskIconKey(type: string): string {\n return this.#inboxService.getTaskIconKey(type);\n }\n\n changePage($event: PageEvent) {\n const { pageSize, pageIndex } = $event;\n this.goToPage(pageIndex + 1);\n }\n\n goToPage(page: number) {\n if (page >= 1) {\n this.#inboxService.fetchTasks(page - 1);\n }\n }\n\n /** UI filter toggles (call service) */\n groupTasksByWeek(): void {\n this.task.set(null);\n this.selectedIndex.set(-1);\n this.#inboxService.toggleIsWeek();\n }\n\n groupTasksByOverdue(): void {\n this.task.set(null);\n this.selectedIndex.set(-1);\n this.#inboxService.toggleIsOverdue();\n }\n\n // groupTasksByDone(): void {\n // this.#inboxService.toggleIsDone();\n // }\n\n onTaskFinished() {\n this.task.set(null);\n this.selectedIndex.set(-1);\n this.#inboxService.fetchTasks();\n }\n\n groupItems(): void {\n this.task.set(null);\n this.selectedIndex.set(-1);\n this.#inboxService.toggleIsAssigned();\n }\n\n /**\n * Updates sort field and direction.\n * @param sort Sorting field.\n * @param order Sort direction.\n */\n updateSort({ sort, order }: { sort: string; order: 'asc' | 'desc' }) {\n this.selectedSort.set(sort);\n this.sortOrder.set(order);\n this.#inboxService.applySort(sort, order);\n }\n\n /**\n * Triggers a debounced fetch from backend (refresh button).\n */\n refresh(): void {\n this.#inboxService.fetchTasks();\n }\n\n isDateOverdue(dateInput?: string | Date): boolean {\n return this.#inboxService.isDateOverdue(dateInput);\n }\n\n\n ngOnInit(): void {\n this.#inboxService.fetchTasks();\n }\n\n /** UI filter state getters for button highlighting */\n get isWeekActive(): boolean {\n return this.#inboxService.activeFilter() === 'week';\n }\n\n get isOverdueActive(): boolean {\n return this.#inboxService.activeFilter() === 'overdue';\n }\n\n get isDoneActive(): boolean {\n return this.#inboxService.activeFilter() === 'done';\n }\n\n get isAssigned(): boolean {\n return this.#inboxService.inbox().isAssigned;\n }\n}\n","<mat-progress-bar\n mode=\"indeterminate\"\n [ngClass]=\"{ busy: busy() }\"\n></mat-progress-bar>\n\n<yuv-master-details\n [(detailsActive)]=\"detailsActive\"\n [layoutOptions]=\"mdLayoutOptions\"\n layoutSettingsID=\"cm.app.documents.documents-list.layout\"\n [gutterSize]=\"16\"\n>\n <ng-template #yuvMasterPane>\n <div class=\"ymt-panel list\">\n <header>\n <h1>{{ \"io.yuuvis.app.inbox.task.header.title\" | translate }}</h1>\n <ymi-sort (sortChange)=\"updateSort($event)\" />\n <div class=\"toolbar\">\n <button\n (click)=\"refresh()\"\n class=\"icon-button\"\n mat-icon-button\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.refresh.title' | translate\n }}\"\n >\n <mat-icon>refresh</mat-icon>\n </button>\n\n <!-- TODO: enable again once the feature is supported on the backend side -->\n <!-- <button\n (click)=\"groupTasksByWeek()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.week.title' | translate\n }}\"\n [class.active]=\"isWeekActive\"\n >\n <mat-icon>calendar_month</mat-icon>\n </button>\n\n <button\n (click)=\"groupTasksByOverdue()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{\n 'io.yuuvis.app.inbox.task.header.button.overdue.title' | translate\n }}\"\n [class.active]=\"isOverdueActive\"\n >\n <mat-icon>schedule</mat-icon>\n </button> -->\n\n <button\n (click)=\"groupItems()\"\n mat-icon-button\n class=\"icon-button\"\n title=\"{{isAssigned ?\n ('io.yuuvis.app.inbox.task.header.button.group.unselected.title' | translate) :\n 'io.yuuvis.app.inbox.task.header.button.group.selected.title' | translate\n }}\"\n [class.active]=\"!isAssigned\"\n >\n <mat-icon>group</mat-icon>\n </button>\n </div>\n </header>\n\n <yuv-list\n (itemSelect)=\"itemSelected($event)\"\n aria-label=\"Task inbox list\"\n >\n @if (!busy()) { @for(i of tasks(); track i.id){\n <div yuvListItem class=\"list-item\">\n <div class=\"list-item__content\">\n <mat-icon\n [matTooltip]=\"system.getLocalizedLabel(i.processDefinition.idPrefix) || i.processDefinition.idPrefix\"\n [svgIcon]=\"getTaskIconKey(i.processDefinition.idPrefix)\"\n ></mat-icon>\n <div class=\"title\">{{ system.getLocalizedLabel(i.name) || i.name }}</div>\n <div\n class=\"subject\"\n [matTooltip]=\"i.processInstanceName\"\n >\n {{ i.processInstanceName }}\n </div>\n <div class=\"receive-date meta\">{{ i.createTime ? (i.createTime | localeDate : \"short\") : \"\" }}</div>\n @if (i.dueDate) {\n <time\n class=\"due meta\"\n [attr.datetime]=\"i.dueDate\"\n [class.overdue]=\"isDateOverdue(i.dueDate)\"\n >\n {{ 'io.yuuvis.app.inbox.task.duedate.prefix' | translate }} {{ i.dueDate | localeDate : \"short\" }}\n </time>\n }\n </div>\n </div>\n } }\n </yuv-list>\n @let pg = inbox().pagination; @if (pg) {\n <mat-paginator\n class=\"paginator\"\n [length]=\"pg?.total\"\n [pageSize]=\"inboxPageSize\"\n aria-label=\"Select page\"\n (page)=\"changePage($event)\"\n hidePageSize\n >\n </mat-paginator>\n }\n </div>\n </ng-template>\n <ng-template #yuvDetailsPane>\n <div class=\"ymt-panel details\">\n @if (task() && !busy()) {\n <ymi-task [task]=\"task()\" (taskFinished)=\"onTaskFinished()\"></ymi-task>\n } @else {\n <div class=\"empty\">\n <p>\n {{ \"io.yuuvis.app.inbox.task.details.empty\" | translate }}\n </p>\n </div>\n }\n </div>\n </ng-template>\n</yuv-master-details>\n","import { Route } from '@angular/router';\nimport { AppInboxComponent } from './app-inbox.component';\nimport { InboxPageComponent } from './pages/inbox/inbox.component';\n\nexport const AppInboxRoutes: Route[] = [\n {\n path: '',\n component: AppInboxComponent,\n children: [\n { path: 'inbox', component: InboxPageComponent},\n { path: '', redirectTo: 'inbox', pathMatch: 'full' }\n ]\n },\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i5","i1","i2","i3","i4"],"mappings":"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"}
|
package/lib/assets/i18n/de.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"io.yuuvis.app.inbox.task.header.title": "Meine Aufgaben",
|
|
3
|
-
"io.yuuvis.app.inbox.task.header.button.group.title": "
|
|
4
|
-
|
|
3
|
+
"io.yuuvis.app.inbox.task.header.button.group.selected.title": "Alle Aufgaben anzeigen",
|
|
4
|
+
"io.yuuvis.app.inbox.task.header.button.group.unselected.title": "Nur Gruppenaufgaben anzeigen",
|
|
5
|
+
"io.yuuvis.app.inbox.task.header.button.refresh.title": "Aktualisieren",
|
|
5
6
|
"io.yuuvis.app.inbox.task.header.button.week.title": "Nach Woche filtern",
|
|
6
7
|
"io.yuuvis.app.inbox.task.header.button.overdue.title": "Nach Überfälligkeit filtern",
|
|
7
8
|
"io.yuuvis.app.inbox.task.header.button.done.title": "Nach Erledigt filtern",
|
|
@@ -18,5 +19,6 @@
|
|
|
18
19
|
"io.yuuvis.app.inbox.task.form.finish": "Beenden",
|
|
19
20
|
"io.yuuvis.app.inbox.task.footer.button.accept": "Aufgabe annehmen",
|
|
20
21
|
"io.yuuvis.app.inbox.task.footer.button.return": "Aufgabe zurückgeben",
|
|
21
|
-
"io.yuuvis.app.inbox.task.details.tab.label.metadata": "Metadaten"
|
|
22
|
+
"io.yuuvis.app.inbox.task.details.tab.label.metadata": "Metadaten",
|
|
23
|
+
"io.yuuvis.app.inbox.task.duedate.prefix": "Fällig am:"
|
|
22
24
|
}
|
package/lib/assets/i18n/en.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"io.yuuvis.app.inbox.task.header.title": "My Tasks",
|
|
3
|
-
"io.yuuvis.app.inbox.task.header.button.group.title": "
|
|
3
|
+
"io.yuuvis.app.inbox.task.header.button.group.selected.title": "Show all tasks",
|
|
4
|
+
"io.yuuvis.app.inbox.task.header.button.group.unselected.title": "Show only group tasks",
|
|
4
5
|
"io.yuuvis.app.inbox.task.header.button.refresh.title": "Refresh",
|
|
5
6
|
"io.yuuvis.app.inbox.task.header.button.week.title": "Filter by week",
|
|
6
7
|
"io.yuuvis.app.inbox.task.header.button.overdue.title": "Filter by overdue",
|
|
@@ -18,5 +19,6 @@
|
|
|
18
19
|
"io.yuuvis.app.inbox.task.form.finish": "Finish",
|
|
19
20
|
"io.yuuvis.app.inbox.task.footer.button.accept": "Accept task",
|
|
20
21
|
"io.yuuvis.app.inbox.task.footer.button.return": "Return task",
|
|
21
|
-
"io.yuuvis.app.inbox.task.details.tab.label.metadata": "Metadata"
|
|
22
|
+
"io.yuuvis.app.inbox.task.details.tab.label.metadata": "Metadata",
|
|
23
|
+
"io.yuuvis.app.inbox.task.duedate.prefix": "Due on:"
|
|
22
24
|
}
|
package/package.json
CHANGED