@yuuvis/app-inbox 0.15.3 → 1.0.0
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.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { HttpParams } from '@angular/common/http';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { inject, signal, computed, Injectable, Component, input, viewChild, output, effect, untracked } from '@angular/core';
|
|
4
|
-
import * as
|
|
4
|
+
import * as i1$1 from '@angular/material/icon';
|
|
5
5
|
import { MatIconRegistry, MatIconModule } from '@angular/material/icon';
|
|
6
6
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
7
7
|
import { signalState, patchState } from '@ngrx/signals';
|
|
@@ -12,7 +12,7 @@ import { AppInboxUtils, APP_INBOX_NAME } from '@yuuvis/app-inbox/shared';
|
|
|
12
12
|
import * as i1 from '@angular/router';
|
|
13
13
|
import { RouterModule } from '@angular/router';
|
|
14
14
|
import { YuvClientShellModule } from '@yuuvis/client-shell';
|
|
15
|
-
import * as i1$
|
|
15
|
+
import * as i1$2 from '@angular/common';
|
|
16
16
|
import { CommonModule } from '@angular/common';
|
|
17
17
|
import * as i4$1 from '@angular/material/button';
|
|
18
18
|
import { MatButtonModule } from '@angular/material/button';
|
|
@@ -317,6 +317,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
317
317
|
], template: "<div class=\"content\">\n <section class=\"properties\">\n <h3 class=\"summary__title\">{{'yuv.object-summary-data.base.headline' | translate }}</h3>\n <div class=\"row\">\n <div class=\"label\">{{\"io.yuuvis.app.inbox.task.detail.subject\" | translate}}</div>\n <div class=\"value\">{{pd()}}</div>\n </div>\n <div class=\"row\">\n <div class=\"label\">{{\"io.yuuvis.app.inbox.task.detail.task\" | translate}}</div>\n <div class=\"value\">{{subject()}}</div>\n </div>\n <div class=\"row\">\n <div class=\"label\">{{\"io.yuuvis.app.inbox.task.detail.processDefinition\" | translate}}</div>\n <div class=\"value\">{{name()}}</div>\n </div>\n <div class=\"row\">\n <div class=\"label\">{{\"io.yuuvis.app.inbox.task.detail.receivedOn\" | translate}}</div>\n <div class=\"value\">{{rec() | localeDate: \"short\"}}</div>\n </div>\n </section>\n</div>", styles: [":host{background-color:var(--_object-metadata-section-background);border:1px solid var(--ymt-outline-variant);border-radius:var(--_object-metadata-section-corner);padding:0}:host .content section.properties{container:section/inline-size;background-color:var(--_object-summary-section-background);border:1px solid var(--_object-summary-section-border-color);border-radius:var(--_object-summary-section-corner);padding:var(--ymt-spacing-m);margin-block-end:var(--ymt-spacing-m)}:host .content section.properties .summary__title{margin-block-start:0;font:var(--ymt-font-body-subtle);letter-spacing:var(--ymt-font-body-subtle-tracking);text-transform:uppercase}:host .content section.properties .row{display:flex;flex-flow:column}:host .content section.properties .row .label{font:var(--ymt-font-body-subtle);flex:0 1 33%;font-weight:700;padding-inline-end:var(--ymt-spacing-m);margin-block-end:var(--ymt-spacing-3xs);text-overflow:ellipsis;overflow:hidden;white-space:normal}:host .content section.properties .row .value{flex:1;word-break:break-all;font:var(--ymt-font-body-subtle);margin-block-end:var(--ymt-spacing-xs)}@container section (min-width: 300px){:host .content section.properties .row{flex-flow:row}}\n"] }]
|
|
318
318
|
}] });
|
|
319
319
|
|
|
320
|
+
class BadgeComponent {
|
|
321
|
+
#inboxService = inject(AppInboxService);
|
|
322
|
+
task = input.required();
|
|
323
|
+
isDateOverdue(dateInput) {
|
|
324
|
+
return this.#inboxService.isDateOverdue(dateInput);
|
|
325
|
+
}
|
|
326
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
327
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: BadgeComponent, isStandalone: true, selector: "ymi-badge", inputs: { task: { classPropertyName: "task", publicName: "task", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@let t = task();\n@let overdue = isDateOverdue(t?.dueDate);\n\n@if (t?.dueDate) {\n<div class=\"badge\" [class.badge--overdue]=\"overdue\">\n\n <span class=\"badge__icon\">\n <mat-icon class=\"ymt-icon--size-s\">schedule</mat-icon>\n </span>\n <span class=\"badge__label\">\n <span class=\"badge__label-truncated\">\n {{\n 'io.yuuvis.app.inbox.task.duedate.prefix' | translate\n }}\n {{ t.dueDate | localeDate : 'short' }}\n @if (overdue) { ! }\n </span>\n </span>\n\n</div>\n}", styles: [":host{display:contents}.badge{display:inline-flex;align-items:center;gap:var(--ymt-spacing-s);padding:var(--ymt-spacing-2xs) var(--ymt-spacing-s) var(--ymt-spacing-2xs) var(--ymt-spacing-xs);border-radius:var(--ymt-corner-full);font:var(--ymt-font-body-subtle);background-color:var(--badge-retention-background, var(--ymt-primary-container));overflow:hidden}.badge__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--badge-retention-icon-color, var(--ymt-on-primary-container))}.badge__label{display:flex;align-items:center;gap:var(--ymt-spacing-xs);border-radius:0 var(--ymt-corner-full) var(--ymt-corner-full) 0}.badge__label-truncated{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;color:var(--badge-retention-color, var(--ymt-on-surface))}.badge--overdue{background-color:var(--ymt-danger-container);color:var(--ymt-on-danger-container)}.badge--overdue .badge__icon{color:var(--ymt-on-danger-container)}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "pipe", type: LocaleDatePipe, name: "localeDate" }] });
|
|
328
|
+
}
|
|
329
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BadgeComponent, decorators: [{
|
|
330
|
+
type: Component,
|
|
331
|
+
args: [{ selector: 'ymi-badge', imports: [MatIconModule, TranslateModule, LocaleDatePipe], template: "@let t = task();\n@let overdue = isDateOverdue(t?.dueDate);\n\n@if (t?.dueDate) {\n<div class=\"badge\" [class.badge--overdue]=\"overdue\">\n\n <span class=\"badge__icon\">\n <mat-icon class=\"ymt-icon--size-s\">schedule</mat-icon>\n </span>\n <span class=\"badge__label\">\n <span class=\"badge__label-truncated\">\n {{\n 'io.yuuvis.app.inbox.task.duedate.prefix' | translate\n }}\n {{ t.dueDate | localeDate : 'short' }}\n @if (overdue) { ! }\n </span>\n </span>\n\n</div>\n}", styles: [":host{display:contents}.badge{display:inline-flex;align-items:center;gap:var(--ymt-spacing-s);padding:var(--ymt-spacing-2xs) var(--ymt-spacing-s) var(--ymt-spacing-2xs) var(--ymt-spacing-xs);border-radius:var(--ymt-corner-full);font:var(--ymt-font-body-subtle);background-color:var(--badge-retention-background, var(--ymt-primary-container));overflow:hidden}.badge__icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--badge-retention-icon-color, var(--ymt-on-primary-container))}.badge__label{display:flex;align-items:center;gap:var(--ymt-spacing-xs);border-radius:0 var(--ymt-corner-full) var(--ymt-corner-full) 0}.badge__label-truncated{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;color:var(--badge-retention-color, var(--ymt-on-surface))}.badge--overdue{background-color:var(--ymt-danger-container);color:var(--ymt-on-danger-container)}.badge--overdue .badge__icon{color:var(--ymt-on-danger-container)}\n"] }]
|
|
332
|
+
}] });
|
|
333
|
+
|
|
320
334
|
class TaskComponent {
|
|
321
335
|
task = input(null);
|
|
322
336
|
#backend = inject(BackendService);
|
|
@@ -491,7 +505,7 @@ class TaskComponent {
|
|
|
491
505
|
this.startFormOptions.set({ formModel: AppInboxUtils.fixFormModel(this.task()?.taskForm?.model), data: formData });
|
|
492
506
|
}
|
|
493
507
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TaskComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
494
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: TaskComponent, isStandalone: true, selector: "ymi-task", inputs: { task: { classPropertyName: "task", publicName: "task", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { taskFinished: "taskFinished", taskUpdated: "taskUpdated" }, viewQueries: [{ propertyName: "taskForm", first: true, predicate: ObjectFormComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@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 <div class=\"form\">\n <div class=\"form-content\">\n @if(sfo) {\n <yuv-object-form\n [readonly]=\"!t.assignee\"\n [formOptions]=\"sfo\"\n (statusChanged)=\"onFormStatusChanged($event)\">\n </yuv-object-form>\n }\n <ymi-task-detail [task]=\"t\"></ymi-task-detail>\n </div>\n </div>\n </div>\n </mat-tab>\n @if (t.attachments) {\n <mat-tab\n [label]=\"\n 'io.yuuvis.app.inbox.task.details.tab.label.attachments' | 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 (isFormAlreadyDirty()) {\n <button\n ymtButton=\"primary\"\n (click)=\"discard()\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.discard\" | translate }}\n </button>\n <button\n ymtButton=\"primary\"\n (click)=\"updateTask()\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.save\" | translate }}\n </button>\n }\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 }\n @if (task()?.assignee) {\n <!-- claim a task -->\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 }\n </footer>\n </div>\n </ng-template>\n\n <!-- attached object -->\n <ng-template yuvSplitArea [size]=\"60\" [visible]=\"hasAttachments()\">\n @if (t.attachments && t.attachments.length > 0) {\n <yuv-object-preview [objectId]=\"t.attachments[0].objectId\"></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", styles: [":host yuv-split-view{height:100%;--split-gutter-background-color: var(--ymt-outline-variant)}:host mat-tab-group{overflow:hidden;height:100%}:host mat-tab-group ::ng-deep .mat-mdc-tab-body-wrapper{height:100%}:host mat-progress-bar{position:absolute;opacity:0}:host mat-progress-bar.busy{opacity:1}:host .details-pane{display:flex;flex-flow:column;height:100%;overflow:hidden}:host .details-pane .task-form{height:100%;overflow:hidden;display:flex;flex-direction:column;background-color:var(--_object-metadata-panel-background)}:host .details-pane .task-form .form{--_object-metadata-panel-background: var(--object-metadata-panel-background, var(--ymt-surface-container-low));--_object-metadata-section-background: var(--object-metadata-section-background, var(--ymt-surface));--_object-metadata-section-corner: var(--object-metadata-section-corner, var(--ymt-corner-m));--_object-metadata-footer-background: var(--object-metadata-footer-background, var(--ymt-surface-container));--_object-metadata-footer-height: 4rem;display:grid;grid-template-rows:1fr auto;grid-template-columns:1fr;height:100%;overflow:hidden;position:relative;background-color:var(--_object-metadata-panel-background)}:host .details-pane .task-form .form .form-content{grid-row:1/span 3;grid-column:1;overflow-y:auto;width:100%;display:flex;flex-flow:column;padding:var(--ymt-spacing-3xl) var(--ymt-spacing-l) var(--_object-metadata-footer-height) var(--ymt-spacing-l)}:host .details-pane .task-form .form .form-content yuv-object-form{margin-block-end:var(--ymt-spacing-m);background-color:var(--_object-summary-section-background);border:1px solid var(--ymt-outline-variant);border-radius:var(--_object-metadata-section-corner);padding:var(--ymt-spacing-m)}:host .details-pane footer{flex:0 0 auto;padding:var(--ymt-spacing-m);display:flex;justify-content:end;align-items:center;border-block-start:1px solid var(--ymt-outline-variant);gap:var(--ymt-spacing-s)}: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 yuv-object-preview{flex:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$
|
|
508
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: TaskComponent, isStandalone: true, selector: "ymi-task", inputs: { task: { classPropertyName: "task", publicName: "task", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { taskFinished: "taskFinished", taskUpdated: "taskUpdated" }, viewQueries: [{ propertyName: "taskForm", first: true, predicate: ObjectFormComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@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 <div class=\"form\">\n <div class=\"form-content\">\n <section class=\"badges\">\n <ymi-badge [task]=\"t\"></ymi-badge>\n </section>\n @if(sfo) {\n <yuv-object-form\n [readonly]=\"!t.assignee\"\n [formOptions]=\"sfo\"\n (statusChanged)=\"onFormStatusChanged($event)\">\n </yuv-object-form>\n }\n <ymi-task-detail [task]=\"t\"></ymi-task-detail>\n </div>\n </div>\n </div>\n </mat-tab>\n @if (t.attachments) {\n <mat-tab\n [label]=\"\n 'io.yuuvis.app.inbox.task.details.tab.label.attachments' | 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 (isFormAlreadyDirty()) {\n <button\n ymtButton=\"primary\"\n (click)=\"discard()\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.discard\" | translate }}\n </button>\n <button\n ymtButton=\"primary\"\n (click)=\"updateTask()\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.save\" | translate }}\n </button>\n }\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 }\n @if (task()?.assignee) {\n <!-- claim a task -->\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 }\n </footer>\n </div>\n </ng-template>\n\n <!-- attached object -->\n <ng-template yuvSplitArea [size]=\"60\" [visible]=\"hasAttachments()\">\n @if (t.attachments && t.attachments.length > 0) {\n <yuv-object-preview [objectId]=\"t.attachments[0].objectId\"></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", styles: [":host yuv-split-view{height:100%;--split-gutter-background-color: var(--ymt-outline-variant)}:host mat-tab-group{overflow:hidden;height:100%}:host mat-tab-group ::ng-deep .mat-mdc-tab-body-wrapper{height:100%}:host mat-progress-bar{position:absolute;opacity:0}:host mat-progress-bar.busy{opacity:1}:host .details-pane{display:flex;flex-flow:column;height:100%;overflow:hidden}:host .details-pane .task-form{height:100%;overflow:hidden;display:flex;flex-direction:column;background-color:var(--_object-metadata-panel-background)}:host .details-pane .task-form .form{--_object-metadata-panel-background: var(--object-metadata-panel-background, var(--ymt-surface-container-low));--_object-metadata-section-background: var(--object-metadata-section-background, var(--ymt-surface));--_object-metadata-section-corner: var(--object-metadata-section-corner, var(--ymt-corner-m));--_object-metadata-footer-background: var(--object-metadata-footer-background, var(--ymt-surface-container));--_object-metadata-footer-height: 4rem;display:grid;grid-template-rows:1fr auto;grid-template-columns:1fr;height:100%;overflow:hidden;position:relative;background-color:var(--_object-metadata-panel-background)}:host .details-pane .task-form .form .form-content{grid-row:1/span 3;grid-column:1;overflow-y:auto;width:100%;display:flex;flex-flow:column;padding:var(--ymt-spacing-3xl) var(--ymt-spacing-l) var(--_object-metadata-footer-height) var(--ymt-spacing-l)}:host .details-pane .task-form .form .form-content yuv-object-form{margin-block-end:var(--ymt-spacing-m);background-color:var(--_object-summary-section-background);border:1px solid var(--ymt-outline-variant);border-radius:var(--_object-metadata-section-corner);padding:var(--ymt-spacing-m)}:host .details-pane .task-form .form .form-content section.badges{padding-bottom:var(--ymt-spacing-m);display:flex;gap:var(--ymt-spacing-s)}:host .details-pane footer{flex:0 0 auto;padding:var(--ymt-spacing-m);display:flex;justify-content:end;align-items:center;border-block-start:1px solid var(--ymt-outline-variant);gap:var(--ymt-spacing-s)}: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 yuv-object-preview{flex:1}\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.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: YuvSplitViewModule }, { kind: "directive", type: i3.SplitAreaDirective, selector: "[yuvSplitArea]", inputs: ["size", "minSize", "maxSize", "panelClass", "visible", "lockSize"] }, { kind: "component", type: i3.SplitViewComponent, selector: "yuv-split-view", inputs: ["direction", "gutterSize", "restrictMove", "disabled", "layoutSettingsID"], outputs: ["layoutSettingsChange", "dragStart", "dragEnd", "gutterClick", "gutterDblClick"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i4.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass", "id"], exportAs: ["matTab"] }, { kind: "component", type: i4.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "mat-align-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: ObjectPreviewComponent, selector: "yuv-object-preview", inputs: ["objectId", "dmsObject", "version", "metadata"] }, { kind: "component", type: ObjectFormComponent, selector: "yuv-object-form", inputs: ["formOptions", "inert", "readonly", "elementExtensions", "isInnerTableForm"], outputs: ["statusChanged", "onFormReady"] }, { kind: "component", type: ObjectMetadataComponent, selector: "yuv-object-metadata", inputs: ["disableControls", "disableBasicMetadata", "elementExtensions", "situation", "formDisabled", "dmsObject", "flavoredDmsObject", "flavors"], outputs: ["indexDataSaved", "statusChanged"] }, { kind: "component", type: TaskDetailComponent, selector: "ymi-task-detail", inputs: ["task"] }, { kind: "component", type: BadgeComponent, selector: "ymi-badge", inputs: ["task"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }] });
|
|
495
509
|
}
|
|
496
510
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TaskComponent, decorators: [{
|
|
497
511
|
type: Component,
|
|
@@ -505,8 +519,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
505
519
|
ObjectFormComponent,
|
|
506
520
|
ObjectMetadataComponent,
|
|
507
521
|
TaskDetailComponent,
|
|
522
|
+
BadgeComponent,
|
|
508
523
|
YmtButtonDirective,
|
|
509
|
-
], template: "@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 <div class=\"form\">\n <div class=\"form-content\">\n @if(sfo) {\n <yuv-object-form\n [readonly]=\"!t.assignee\"\n [formOptions]=\"sfo\"\n (statusChanged)=\"onFormStatusChanged($event)\">\n </yuv-object-form>\n }\n <ymi-task-detail [task]=\"t\"></ymi-task-detail>\n </div>\n </div>\n </div>\n </mat-tab>\n @if (t.attachments) {\n <mat-tab\n [label]=\"\n 'io.yuuvis.app.inbox.task.details.tab.label.attachments' | 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 (isFormAlreadyDirty()) {\n <button\n ymtButton=\"primary\"\n (click)=\"discard()\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.discard\" | translate }}\n </button>\n <button\n ymtButton=\"primary\"\n (click)=\"updateTask()\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.save\" | translate }}\n </button>\n }\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 }\n @if (task()?.assignee) {\n <!-- claim a task -->\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 }\n </footer>\n </div>\n </ng-template>\n\n <!-- attached object -->\n <ng-template yuvSplitArea [size]=\"60\" [visible]=\"hasAttachments()\">\n @if (t.attachments && t.attachments.length > 0) {\n <yuv-object-preview [objectId]=\"t.attachments[0].objectId\"></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", styles: [":host yuv-split-view{height:100%;--split-gutter-background-color: var(--ymt-outline-variant)}:host mat-tab-group{overflow:hidden;height:100%}:host mat-tab-group ::ng-deep .mat-mdc-tab-body-wrapper{height:100%}:host mat-progress-bar{position:absolute;opacity:0}:host mat-progress-bar.busy{opacity:1}:host .details-pane{display:flex;flex-flow:column;height:100%;overflow:hidden}:host .details-pane .task-form{height:100%;overflow:hidden;display:flex;flex-direction:column;background-color:var(--_object-metadata-panel-background)}:host .details-pane .task-form .form{--_object-metadata-panel-background: var(--object-metadata-panel-background, var(--ymt-surface-container-low));--_object-metadata-section-background: var(--object-metadata-section-background, var(--ymt-surface));--_object-metadata-section-corner: var(--object-metadata-section-corner, var(--ymt-corner-m));--_object-metadata-footer-background: var(--object-metadata-footer-background, var(--ymt-surface-container));--_object-metadata-footer-height: 4rem;display:grid;grid-template-rows:1fr auto;grid-template-columns:1fr;height:100%;overflow:hidden;position:relative;background-color:var(--_object-metadata-panel-background)}:host .details-pane .task-form .form .form-content{grid-row:1/span 3;grid-column:1;overflow-y:auto;width:100%;display:flex;flex-flow:column;padding:var(--ymt-spacing-3xl) var(--ymt-spacing-l) var(--_object-metadata-footer-height) var(--ymt-spacing-l)}:host .details-pane .task-form .form .form-content yuv-object-form{margin-block-end:var(--ymt-spacing-m);background-color:var(--_object-summary-section-background);border:1px solid var(--ymt-outline-variant);border-radius:var(--_object-metadata-section-corner);padding:var(--ymt-spacing-m)}:host .details-pane footer{flex:0 0 auto;padding:var(--ymt-spacing-m);display:flex;justify-content:end;align-items:center;border-block-start:1px solid var(--ymt-outline-variant);gap:var(--ymt-spacing-s)}: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 yuv-object-preview{flex:1}\n"] }]
|
|
524
|
+
], template: "@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 <div class=\"form\">\n <div class=\"form-content\">\n <section class=\"badges\">\n <ymi-badge [task]=\"t\"></ymi-badge>\n </section>\n @if(sfo) {\n <yuv-object-form\n [readonly]=\"!t.assignee\"\n [formOptions]=\"sfo\"\n (statusChanged)=\"onFormStatusChanged($event)\">\n </yuv-object-form>\n }\n <ymi-task-detail [task]=\"t\"></ymi-task-detail>\n </div>\n </div>\n </div>\n </mat-tab>\n @if (t.attachments) {\n <mat-tab\n [label]=\"\n 'io.yuuvis.app.inbox.task.details.tab.label.attachments' | 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 (isFormAlreadyDirty()) {\n <button\n ymtButton=\"primary\"\n (click)=\"discard()\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.discard\" | translate }}\n </button>\n <button\n ymtButton=\"primary\"\n (click)=\"updateTask()\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.save\" | translate }}\n </button>\n }\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 }\n @if (task()?.assignee) {\n <!-- claim a task -->\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 }\n </footer>\n </div>\n </ng-template>\n\n <!-- attached object -->\n <ng-template yuvSplitArea [size]=\"60\" [visible]=\"hasAttachments()\">\n @if (t.attachments && t.attachments.length > 0) {\n <yuv-object-preview [objectId]=\"t.attachments[0].objectId\"></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", styles: [":host yuv-split-view{height:100%;--split-gutter-background-color: var(--ymt-outline-variant)}:host mat-tab-group{overflow:hidden;height:100%}:host mat-tab-group ::ng-deep .mat-mdc-tab-body-wrapper{height:100%}:host mat-progress-bar{position:absolute;opacity:0}:host mat-progress-bar.busy{opacity:1}:host .details-pane{display:flex;flex-flow:column;height:100%;overflow:hidden}:host .details-pane .task-form{height:100%;overflow:hidden;display:flex;flex-direction:column;background-color:var(--_object-metadata-panel-background)}:host .details-pane .task-form .form{--_object-metadata-panel-background: var(--object-metadata-panel-background, var(--ymt-surface-container-low));--_object-metadata-section-background: var(--object-metadata-section-background, var(--ymt-surface));--_object-metadata-section-corner: var(--object-metadata-section-corner, var(--ymt-corner-m));--_object-metadata-footer-background: var(--object-metadata-footer-background, var(--ymt-surface-container));--_object-metadata-footer-height: 4rem;display:grid;grid-template-rows:1fr auto;grid-template-columns:1fr;height:100%;overflow:hidden;position:relative;background-color:var(--_object-metadata-panel-background)}:host .details-pane .task-form .form .form-content{grid-row:1/span 3;grid-column:1;overflow-y:auto;width:100%;display:flex;flex-flow:column;padding:var(--ymt-spacing-3xl) var(--ymt-spacing-l) var(--_object-metadata-footer-height) var(--ymt-spacing-l)}:host .details-pane .task-form .form .form-content yuv-object-form{margin-block-end:var(--ymt-spacing-m);background-color:var(--_object-summary-section-background);border:1px solid var(--ymt-outline-variant);border-radius:var(--_object-metadata-section-corner);padding:var(--ymt-spacing-m)}:host .details-pane .task-form .form .form-content section.badges{padding-bottom:var(--ymt-spacing-m);display:flex;gap:var(--ymt-spacing-s)}:host .details-pane footer{flex:0 0 auto;padding:var(--ymt-spacing-m);display:flex;justify-content:end;align-items:center;border-block-start:1px solid var(--ymt-outline-variant);gap:var(--ymt-spacing-s)}: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 yuv-object-preview{flex:1}\n"] }]
|
|
510
525
|
}] });
|
|
511
526
|
|
|
512
527
|
class InboxPageComponent {
|
|
@@ -673,7 +688,7 @@ class InboxPageComponent {
|
|
|
673
688
|
return this.#inboxService.inbox().isAssigned;
|
|
674
689
|
}
|
|
675
690
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: InboxPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
676
|
-
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 <yuv-sort [sortOptions]=\"sortOptions()\" [storageKey]=\"storageKey\" (sortChanged)=\"updateSort($event)\"></yuv-sort>\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 @if (!busy() && tasks().length > 0) { @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.processDefinitionId.split(':')[0])\n || i.processDefinitionId.split(':')[0]\"\n [svgIcon]=\"getTaskIconKey(i.processDefinitionId.split(':')[0])\"\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 } } @else {\n <div class=\"empty\">\n <mat-icon>inbox</mat-icon>\n <p>{{ \"io.yuuvis.app.inbox.task.list.empty\" | translate }}</p>\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()\" (taskUpdated)=\"onTaskUpdated()\" (taskFinished)=\"onTaskFinished()\"></ymi-task>\n } @else if(tasks().length === 0) {\n <div class=\"empty\">\n <mat-icon>no_sim</mat-icon>\n </div>\n } @else {\n <div class=\"empty\">\n <p>{{ \"io.yuuvis.app.inbox.task.details.empty\" | translate }}</p>\n </div>\n }\n </div>\n </ng-template>\n</yuv-master-details>", 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 .empty mat-icon{display:flex;justify-content:center;align-items:center;font-size:4.2rem;width:2.3em;height:1.1em;fill:var(--ymt-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-smallest)}: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$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: YuvSplitViewModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$1.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: ["preventChangeUntil", "multiselect", "selfHandleSelection", "autoSelect", "disableSelection"], outputs: ["itemSelect", "itemFocus"] }, { kind: "component", type: TaskComponent, selector: "ymi-task", inputs: ["task"], outputs: ["taskFinished", "taskUpdated"] }, { kind: "component", type: SortComponent, selector: "yuv-sort", inputs: ["sortOptions", "selectedSortOption", "storageKey", "small"], outputs: ["sortChanged"] }, { 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"], 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" }] });
|
|
691
|
+
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 <yuv-sort [sortOptions]=\"sortOptions()\" [storageKey]=\"storageKey\" (sortChanged)=\"updateSort($event)\"></yuv-sort>\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 @if (!busy() && tasks().length > 0) { @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.processDefinitionId.split(':')[0])\n || i.processDefinitionId.split(':')[0]\"\n [svgIcon]=\"getTaskIconKey(i.processDefinitionId.split(':')[0])\"\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 } } @else {\n <div class=\"empty\">\n <mat-icon>inbox</mat-icon>\n <p>{{isAssigned ? ('io.yuuvis.app.inbox.task.list.empty' | translate) : 'io.yuuvis.app.inbox.task.group.list.empty' | translate\n }}</p>\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()\" (taskUpdated)=\"onTaskUpdated()\" (taskFinished)=\"onTaskFinished()\"></ymi-task>\n } @else if(tasks().length === 0) {\n <div class=\"empty\">\n <mat-icon>no_sim</mat-icon>\n </div>\n } @else {\n <div class=\"empty\">\n <p>{{ \"io.yuuvis.app.inbox.task.details.empty\" | translate }}</p>\n </div>\n }\n </div>\n </ng-template>\n</yuv-master-details>", 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 .empty mat-icon{display:flex;justify-content:center;align-items:center;font-size:4.2rem;width:2.3em;height:1.1em;fill:var(--ymt-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-smallest)}: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.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: YuvSplitViewModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4$1.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: ["preventChangeUntil", "multiselect", "selfHandleSelection", "autoSelect", "disableSelection"], outputs: ["itemSelect", "itemFocus"] }, { kind: "component", type: TaskComponent, selector: "ymi-task", inputs: ["task"], outputs: ["taskFinished", "taskUpdated"] }, { kind: "component", type: SortComponent, selector: "yuv-sort", inputs: ["sortOptions", "selectedSortOption", "storageKey", "small"], outputs: ["sortChanged"] }, { 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"], 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" }] });
|
|
677
692
|
}
|
|
678
693
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: InboxPageComponent, decorators: [{
|
|
679
694
|
type: Component,
|
|
@@ -695,7 +710,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
695
710
|
SortComponent,
|
|
696
711
|
], host: {
|
|
697
712
|
'[class.pagination]': 'inbox().pagination',
|
|
698
|
-
}, 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 <yuv-sort [sortOptions]=\"sortOptions()\" [storageKey]=\"storageKey\" (sortChanged)=\"updateSort($event)\"></yuv-sort>\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 @if (!busy() && tasks().length > 0) { @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.processDefinitionId.split(':')[0])\n || i.processDefinitionId.split(':')[0]\"\n [svgIcon]=\"getTaskIconKey(i.processDefinitionId.split(':')[0])\"\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 } } @else {\n <div class=\"empty\">\n <mat-icon>inbox</mat-icon>\n <p>{{
|
|
713
|
+
}, 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 <yuv-sort [sortOptions]=\"sortOptions()\" [storageKey]=\"storageKey\" (sortChanged)=\"updateSort($event)\"></yuv-sort>\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 @if (!busy() && tasks().length > 0) { @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.processDefinitionId.split(':')[0])\n || i.processDefinitionId.split(':')[0]\"\n [svgIcon]=\"getTaskIconKey(i.processDefinitionId.split(':')[0])\"\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 } } @else {\n <div class=\"empty\">\n <mat-icon>inbox</mat-icon>\n <p>{{isAssigned ? ('io.yuuvis.app.inbox.task.list.empty' | translate) : 'io.yuuvis.app.inbox.task.group.list.empty' | translate\n }}</p>\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()\" (taskUpdated)=\"onTaskUpdated()\" (taskFinished)=\"onTaskFinished()\"></ymi-task>\n } @else if(tasks().length === 0) {\n <div class=\"empty\">\n <mat-icon>no_sim</mat-icon>\n </div>\n } @else {\n <div class=\"empty\">\n <p>{{ \"io.yuuvis.app.inbox.task.details.empty\" | translate }}</p>\n </div>\n }\n </div>\n </ng-template>\n</yuv-master-details>", 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 .empty mat-icon{display:flex;justify-content:center;align-items:center;font-size:4.2rem;width:2.3em;height:1.1em;fill:var(--ymt-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-smallest)}: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"] }]
|
|
699
714
|
}] });
|
|
700
715
|
|
|
701
716
|
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/app-inbox.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/app-inbox.component.html","../../../../projects/yuuvis/app-inbox/src/lib/components/task/task-detail/task-detail.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/components/task/task-detail/task-detail.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 UserService\n} from '@yuuvis/client-core';\nimport { ObjectFormOptions } from '@yuuvis/client-framework/object-form';\nimport { finalize, Observable, tap } from 'rxjs';\nimport {AppInboxUtils, InboxState, ProcessCreatePayload, 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 #userService = inject(UserService);\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 */\n fetchTasks(page = 0) {\n let p: HttpParams;\n\n if (this.inbox().isAssigned) {\n p = new HttpParams()\n .set('size', this.PAGE_SIZE)\n .set('includeProcessVariables', true)\n .set('sort', this.inbox().sort)\n .set('visibleTo', this.#userService.getCurrentUser().id)\n .set('isCompleted', false)\n .set('page', page);\n } else {\n p = new HttpParams()\n .set('size', this.PAGE_SIZE)\n .set('includeProcessVariables', true)\n .set('isAssigned', false)\n .set('sort', this.inbox().sort)\n .set('visibleTo', this.#userService.getCurrentUser().id)\n .set('isCompleted', false)\n .set('page', page);\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-engine/api/tasks?${p}`, ApiBase.none)\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.processDefinitionId.split(':')[0]).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 fetchTask(taskID: string) {\n let p = new HttpParams()\n .set('includeProcessVariables', true);\n return this.#backend.get(`/bpm-engine/api/tasks/${taskID}?${p}`, ApiBase.none);\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 suppressRefetching?: boolean;\n }\n ) {\n const pl = { ...payload, action: action };\n return (\n this.#backend\n .patch(`/bpm-engine/api/tasks/${taskId}`, pl, ApiBase.none)\n .pipe(\n tap((_) =>\n options\n ? !options.suppressRefetching ? this.fetchTasks(this.inbox().pagination?.page || 0) : null\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 the start-form for a given process.\n * @param processID The id of the process from which the start-form should be returned.\n */\n\n getStartForm(processID: string): Observable<any> {\n return this.#backend.get(`/bpm-engine/api/process-definitions/${processID}/start-form`, ApiBase.none);\n }\n\n /**\n * Start a process. This will create a new process instance.\n * @param payload Payload to be sent 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-engine/api/processes`, payload, ApiBase.none);\n }\n\n /**\n * Returns the form for a given task.\n * @param taskID The id of the task from which the form should be returned.\n */\n fetchTaskForm(taskID: string): Observable<any> {\n return this.#backend.get(`/bpm-engine/api/tasks/${taskID}/form`, ApiBase.none);\n }\n\n /**\n * Returns the attachments for a given task.\n * @param taskID The id of the task from which the attachments should be returned.\n */\n fetchAttachments(taskID: string): Observable<any> {\n return this.#backend.get(`/bpm-engine/api/tasks/${taskID}/attachments`, ApiBase.none);\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 } 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';\n\n@Component({\n selector: 'ymi-app-inbox',\n standalone: true,\n imports: [TranslateModule, RouterModule, 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 { Component, inject, input } from '@angular/core';\nimport { Task } from '@yuuvis/app-inbox/shared';\nimport {\n LocaleDatePipe,\n SystemService,\n TranslateModule,\n TranslateService,\n} from '@yuuvis/client-core';\n\n\n@Component({\n selector: 'ymi-task-detail',\n imports: [\n TranslateModule,\n LocaleDatePipe\n],\n templateUrl: './task-detail.component.html',\n styleUrls: ['./task-detail.component.scss']\n})\nexport class TaskDetailComponent {\n task = input.required<Task>();\n readonly translate = inject(TranslateService);\n readonly system = inject(SystemService)\n \n pd = () => this.system.getLocalizedLabel(this.task().processDefinitionId?.split(':')[0]) || this.task().processDefinitionId?.split(':')[0]\n subject = () => this.task().processInstanceName\n name = () => this.system.getLocalizedLabel(this.task().name) || this.task().name\n rec = () => this.task().createTime\n dateDue = () => this.task().dueDate\n\n}","<div class=\"content\">\n <section class=\"properties\">\n <h3 class=\"summary__title\">{{'yuv.object-summary-data.base.headline' | translate }}</h3>\n <div class=\"row\">\n <div class=\"label\">{{\"io.yuuvis.app.inbox.task.detail.subject\" | translate}}</div>\n <div class=\"value\">{{pd()}}</div>\n </div>\n <div class=\"row\">\n <div class=\"label\">{{\"io.yuuvis.app.inbox.task.detail.task\" | translate}}</div>\n <div class=\"value\">{{subject()}}</div>\n </div>\n <div class=\"row\">\n <div class=\"label\">{{\"io.yuuvis.app.inbox.task.detail.processDefinition\" | translate}}</div>\n <div class=\"value\">{{name()}}</div>\n </div>\n <div class=\"row\">\n <div class=\"label\">{{\"io.yuuvis.app.inbox.task.detail.receivedOn\" | translate}}</div>\n <div class=\"value\">{{rec() | localeDate: \"short\"}}</div>\n </div>\n </section>\n</div>","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 ApiBase,\n BackendService,\n DmsObject,\n DmsService,\n FlavoredDmsObject,\n PendingChangesService,\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';\nimport { TaskDetailComponent } from './task-detail/task-detail.component';\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 TaskDetailComponent,\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 #pendingChanges = inject(PendingChangesService);\n translate = inject(TranslateService);\n\n taskForm = viewChild(ObjectFormComponent);\n\n taskFinished = output<void>();\n taskUpdated = output<void>();\n pendingTaskID = '';\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 && Object.keys(task.taskForm.model).length) {\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 isFormAlreadyDirty = signal<boolean>(false);\n\n hasAttachments = computed(() => {\n const task = this.task();\n if (task?.attachments?.length === 0) return false;\n const attachmentId = task?.attachments[0].objectId ?? '';\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 if (evt.dirty && !this.isFormAlreadyDirty()) {\n this.pendingTaskID = this.#pendingChanges.startTask(this.translate.instant('yuv.object-metadata.pending-changes.alert'));\n this.isFormAlreadyDirty.set(true);\n } else if (!evt.dirty && this.isFormAlreadyDirty()) {\n this.isFormAlreadyDirty.set(false);\n }\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' ? currentUserId : null,\n };\n\n this.#backend.patch(`/bpm-engine/api/tasks/${taskId}`, payload, ApiBase.none).subscribe({\n next: () => {\n this.taskFinished.emit();\n },\n error: (err) => {\n console.error('Error while handling task:', err);\n },\n });\n }\n\n updateTask() {\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 this.#inboxService.updateTask(this.task()!.id, 'save', { variables }, {suppressRefetching: true}).subscribe({\n next: () => {\n this.isFormAlreadyDirty.set(false);\n this.#pendingChanges.finishTask(this.pendingTaskID);\n this.taskUpdated.emit();\n this.taskForm()?.setFormPristine();\n },\n error: (err) => {\n console.error('Error while updating task:', err);\n },\n });\n }\n\n discard() {\n this.#pendingChanges.finishTask(this.pendingTaskID);\n const formData = this.#getFormDataFromProcessVars(this.task()!);\n this.startFormOptions.set({formModel: AppInboxUtils.fixFormModel(this.task()?.taskForm?.model), data: formData});\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 <div class=\"form\">\n <div class=\"form-content\">\n @if(sfo) {\n <yuv-object-form\n [readonly]=\"!t.assignee\"\n [formOptions]=\"sfo\"\n (statusChanged)=\"onFormStatusChanged($event)\">\n </yuv-object-form>\n }\n <ymi-task-detail [task]=\"t\"></ymi-task-detail>\n </div>\n </div>\n </div>\n </mat-tab>\n @if (t.attachments) {\n <mat-tab\n [label]=\"\n 'io.yuuvis.app.inbox.task.details.tab.label.attachments' | 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 (isFormAlreadyDirty()) {\n <button\n ymtButton=\"primary\"\n (click)=\"discard()\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.discard\" | translate }}\n </button>\n <button\n ymtButton=\"primary\"\n (click)=\"updateTask()\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.save\" | translate }}\n </button>\n }\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 }\n @if (task()?.assignee) {\n <!-- claim a task -->\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 }\n </footer>\n </div>\n </ng-template>\n\n <!-- attached object -->\n <ng-template yuvSplitArea [size]=\"60\" [visible]=\"hasAttachments()\">\n @if (t.attachments && t.attachments.length > 0) {\n <yuv-object-preview [objectId]=\"t.attachments[0].objectId\"></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, PendingChangesService, 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 { TaskComponent } from '../../components/task/task.component';\nimport { Task } from '@yuuvis/app-inbox/shared';\nimport {MasterDetailsLayoutOptions, YuvMasterDetailsComponent} from \"@yuuvis/client-framework/master-details\";\nimport {SortComponent} from '@yuuvis/client-framework/sort';\nimport {catchError, forkJoin, of} from 'rxjs';\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 SortComponent,\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 #pendingChanges = inject(PendingChangesService);\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 sortOptions = signal(this.#setSortOptions());\n storageKey = 'yuv.app.inbox.tasks.sort';\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 #setSortOptions() {\n return ['createTime', 'dueDate'];\n }\n\n fetchAttachments(taskId: string) {\n return this.#inboxService.fetchAttachments(taskId);\n }\n\n fetchTaskForm(taskId: string) {\n return this.#inboxService.fetchTaskForm(taskId).pipe(\n catchError(error => {\n if (error.status === 404) {\n return of(null);\n }\n throw error;\n })\n );\n }\n\n itemSelected(idx: number[]) {\n if (!this.#pendingChanges.check()) {\n const tasks = this.tasks() ?? [];\n const selectedIdx = idx[0];\n\n if (selectedIdx >= 0 && selectedIdx < tasks.length) {\n this.selectedIndex.set(selectedIdx);\n forkJoin({form: this.fetchTaskForm(tasks[selectedIdx].id),\n attachments: this.fetchAttachments(tasks[selectedIdx].id)})\n .subscribe(({form, attachments}) => {\n tasks[selectedIdx].taskForm = form;\n tasks[selectedIdx].attachments = attachments;\n this.task.set(tasks[selectedIdx]);\n })\n } else {\n this.selectedIndex.set(-1);\n this.task.set(null);\n }\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 this.#pendingChanges.clear();\n }\n\n onTaskUpdated() {\n this.#inboxService.fetchTask(this.task()!.id).subscribe((task) => {\n const tasks = this.tasks() ?? [];\n tasks[this.selectedIndex()].variables = task.variables;\n this.task.set(tasks[this.selectedIndex()]);\n this.#pendingChanges.clear();\n });\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(evt: any) {\n this.selectedSort.set(evt.field);\n this.sortOrder.set(evt.order);\n this.#inboxService.applySort(evt.field, evt.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 <yuv-sort [sortOptions]=\"sortOptions()\" [storageKey]=\"storageKey\" (sortChanged)=\"updateSort($event)\"></yuv-sort>\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 @if (!busy() && tasks().length > 0) { @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.processDefinitionId.split(':')[0])\n || i.processDefinitionId.split(':')[0]\"\n [svgIcon]=\"getTaskIconKey(i.processDefinitionId.split(':')[0])\"\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 } } @else {\n <div class=\"empty\">\n <mat-icon>inbox</mat-icon>\n <p>{{ \"io.yuuvis.app.inbox.task.list.empty\" | translate }}</p>\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()\" (taskUpdated)=\"onTaskUpdated()\" (taskFinished)=\"onTaskFinished()\"></ymi-task>\n } @else if(tasks().length === 0) {\n <div class=\"empty\">\n <mat-icon>no_sim</mat-icon>\n </div>\n } @else {\n <div class=\"empty\">\n <p>{{ \"io.yuuvis.app.inbox.task.details.empty\" | translate }}</p>\n </div>\n }\n </div>\n </ng-template>\n</yuv-master-details>","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":["i1","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/app-inbox.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/app-inbox.component.html","../../../../projects/yuuvis/app-inbox/src/lib/components/task/task-detail/task-detail.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/components/task/task-detail/task-detail.component.html","../../../../projects/yuuvis/app-inbox/src/lib/components/task/badge/badge.component.ts","../../../../projects/yuuvis/app-inbox/src/lib/components/task/badge/badge.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 UserService\n} from '@yuuvis/client-core';\nimport { ObjectFormOptions } from '@yuuvis/client-framework/object-form';\nimport { finalize, Observable, tap } from 'rxjs';\nimport {AppInboxUtils, InboxState, ProcessCreatePayload, 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 #userService = inject(UserService);\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 */\n fetchTasks(page = 0) {\n let p: HttpParams;\n\n if (this.inbox().isAssigned) {\n p = new HttpParams()\n .set('size', this.PAGE_SIZE)\n .set('includeProcessVariables', true)\n .set('sort', this.inbox().sort)\n .set('visibleTo', this.#userService.getCurrentUser().id)\n .set('isCompleted', false)\n .set('page', page);\n } else {\n p = new HttpParams()\n .set('size', this.PAGE_SIZE)\n .set('includeProcessVariables', true)\n .set('isAssigned', false)\n .set('sort', this.inbox().sort)\n .set('visibleTo', this.#userService.getCurrentUser().id)\n .set('isCompleted', false)\n .set('page', page);\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-engine/api/tasks?${p}`, ApiBase.none)\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.processDefinitionId.split(':')[0]).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 fetchTask(taskID: string) {\n let p = new HttpParams()\n .set('includeProcessVariables', true);\n return this.#backend.get(`/bpm-engine/api/tasks/${taskID}?${p}`, ApiBase.none);\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 suppressRefetching?: boolean;\n }\n ) {\n const pl = { ...payload, action: action };\n return (\n this.#backend\n .patch(`/bpm-engine/api/tasks/${taskId}`, pl, ApiBase.none)\n .pipe(\n tap((_) =>\n options\n ? !options.suppressRefetching ? this.fetchTasks(this.inbox().pagination?.page || 0) : null\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 the start-form for a given process.\n * @param processID The id of the process from which the start-form should be returned.\n */\n\n getStartForm(processID: string): Observable<any> {\n return this.#backend.get(`/bpm-engine/api/process-definitions/${processID}/start-form`, ApiBase.none);\n }\n\n /**\n * Start a process. This will create a new process instance.\n * @param payload Payload to be sent 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-engine/api/processes`, payload, ApiBase.none);\n }\n\n /**\n * Returns the form for a given task.\n * @param taskID The id of the task from which the form should be returned.\n */\n fetchTaskForm(taskID: string): Observable<any> {\n return this.#backend.get(`/bpm-engine/api/tasks/${taskID}/form`, ApiBase.none);\n }\n\n /**\n * Returns the attachments for a given task.\n * @param taskID The id of the task from which the attachments should be returned.\n */\n fetchAttachments(taskID: string): Observable<any> {\n return this.#backend.get(`/bpm-engine/api/tasks/${taskID}/attachments`, ApiBase.none);\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 } 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';\n\n@Component({\n selector: 'ymi-app-inbox',\n standalone: true,\n imports: [TranslateModule, RouterModule, 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 { Component, inject, input } from '@angular/core';\nimport { Task } from '@yuuvis/app-inbox/shared';\nimport {\n LocaleDatePipe,\n SystemService,\n TranslateModule,\n TranslateService,\n} from '@yuuvis/client-core';\n\n\n@Component({\n selector: 'ymi-task-detail',\n imports: [\n TranslateModule,\n LocaleDatePipe\n],\n templateUrl: './task-detail.component.html',\n styleUrls: ['./task-detail.component.scss']\n})\nexport class TaskDetailComponent {\n task = input.required<Task>();\n readonly translate = inject(TranslateService);\n readonly system = inject(SystemService)\n \n pd = () => this.system.getLocalizedLabel(this.task().processDefinitionId?.split(':')[0]) || this.task().processDefinitionId?.split(':')[0]\n subject = () => this.task().processInstanceName\n name = () => this.system.getLocalizedLabel(this.task().name) || this.task().name\n rec = () => this.task().createTime\n dateDue = () => this.task().dueDate\n\n}","<div class=\"content\">\n <section class=\"properties\">\n <h3 class=\"summary__title\">{{'yuv.object-summary-data.base.headline' | translate }}</h3>\n <div class=\"row\">\n <div class=\"label\">{{\"io.yuuvis.app.inbox.task.detail.subject\" | translate}}</div>\n <div class=\"value\">{{pd()}}</div>\n </div>\n <div class=\"row\">\n <div class=\"label\">{{\"io.yuuvis.app.inbox.task.detail.task\" | translate}}</div>\n <div class=\"value\">{{subject()}}</div>\n </div>\n <div class=\"row\">\n <div class=\"label\">{{\"io.yuuvis.app.inbox.task.detail.processDefinition\" | translate}}</div>\n <div class=\"value\">{{name()}}</div>\n </div>\n <div class=\"row\">\n <div class=\"label\">{{\"io.yuuvis.app.inbox.task.detail.receivedOn\" | translate}}</div>\n <div class=\"value\">{{rec() | localeDate: \"short\"}}</div>\n </div>\n </section>\n</div>","import { Component, inject, input } from '@angular/core';\nimport { LocaleDatePipe, TranslateModule } from '@yuuvis/client-core';\nimport { Task } from '@yuuvis/app-inbox/shared';\nimport { MatIconModule } from '@angular/material/icon';\nimport { AppInboxService } from '../../../app-inbox.service';\n\n\n@Component({\n selector: 'ymi-badge',\n imports: [MatIconModule, TranslateModule, LocaleDatePipe],\n templateUrl: './badge.component.html',\n styleUrl: './badge.component.scss'\n})\nexport class BadgeComponent {\n readonly #inboxService = inject(AppInboxService);\n task = input.required<Task>();\n\n isDateOverdue(dateInput?: string | Date): boolean {\n return this.#inboxService.isDateOverdue(dateInput);\n }\n\n}\n","@let t = task();\n@let overdue = isDateOverdue(t?.dueDate);\n\n@if (t?.dueDate) {\n<div class=\"badge\" [class.badge--overdue]=\"overdue\">\n\n <span class=\"badge__icon\">\n <mat-icon class=\"ymt-icon--size-s\">schedule</mat-icon>\n </span>\n <span class=\"badge__label\">\n <span class=\"badge__label-truncated\">\n {{\n 'io.yuuvis.app.inbox.task.duedate.prefix' | translate\n }}\n {{ t.dueDate | localeDate : 'short' }}\n @if (overdue) { ! }\n </span>\n </span>\n\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 ApiBase,\n BackendService,\n DmsObject,\n DmsService,\n FlavoredDmsObject,\n PendingChangesService,\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';\nimport { TaskDetailComponent } from './task-detail/task-detail.component';\nimport { BadgeComponent } from './badge/badge.component';\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 TaskDetailComponent,\n BadgeComponent,\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 #pendingChanges = inject(PendingChangesService);\n translate = inject(TranslateService);\n\n taskForm = viewChild(ObjectFormComponent);\n\n taskFinished = output<void>();\n taskUpdated = output<void>();\n pendingTaskID = '';\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 && Object.keys(task.taskForm.model).length) {\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 isFormAlreadyDirty = signal<boolean>(false);\n\n hasAttachments = computed(() => {\n const task = this.task();\n if (task?.attachments?.length === 0) return false;\n const attachmentId = task?.attachments[0].objectId ?? '';\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 if (evt.dirty && !this.isFormAlreadyDirty()) {\n this.pendingTaskID = this.#pendingChanges.startTask(this.translate.instant('yuv.object-metadata.pending-changes.alert'));\n this.isFormAlreadyDirty.set(true);\n } else if (!evt.dirty && this.isFormAlreadyDirty()) {\n this.isFormAlreadyDirty.set(false);\n }\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' ? currentUserId : null,\n };\n\n this.#backend.patch(`/bpm-engine/api/tasks/${taskId}`, payload, ApiBase.none).subscribe({\n next: () => {\n this.taskFinished.emit();\n },\n error: (err) => {\n console.error('Error while handling task:', err);\n },\n });\n }\n\n updateTask() {\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 this.#inboxService.updateTask(this.task()!.id, 'save', { variables }, {suppressRefetching: true}).subscribe({\n next: () => {\n this.isFormAlreadyDirty.set(false);\n this.#pendingChanges.finishTask(this.pendingTaskID);\n this.taskUpdated.emit();\n this.taskForm()?.setFormPristine();\n },\n error: (err) => {\n console.error('Error while updating task:', err);\n },\n });\n }\n\n discard() {\n this.#pendingChanges.finishTask(this.pendingTaskID);\n const formData = this.#getFormDataFromProcessVars(this.task()!);\n this.startFormOptions.set({formModel: AppInboxUtils.fixFormModel(this.task()?.taskForm?.model), data: formData});\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 <div class=\"form\">\n <div class=\"form-content\">\n <section class=\"badges\">\n <ymi-badge [task]=\"t\"></ymi-badge>\n </section>\n @if(sfo) {\n <yuv-object-form\n [readonly]=\"!t.assignee\"\n [formOptions]=\"sfo\"\n (statusChanged)=\"onFormStatusChanged($event)\">\n </yuv-object-form>\n }\n <ymi-task-detail [task]=\"t\"></ymi-task-detail>\n </div>\n </div>\n </div>\n </mat-tab>\n @if (t.attachments) {\n <mat-tab\n [label]=\"\n 'io.yuuvis.app.inbox.task.details.tab.label.attachments' | 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 (isFormAlreadyDirty()) {\n <button\n ymtButton=\"primary\"\n (click)=\"discard()\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.discard\" | translate }}\n </button>\n <button\n ymtButton=\"primary\"\n (click)=\"updateTask()\"\n >\n {{ \"io.yuuvis.app.inbox.task.footer.button.save\" | translate }}\n </button>\n }\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 }\n @if (task()?.assignee) {\n <!-- claim a task -->\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 }\n </footer>\n </div>\n </ng-template>\n\n <!-- attached object -->\n <ng-template yuvSplitArea [size]=\"60\" [visible]=\"hasAttachments()\">\n @if (t.attachments && t.attachments.length > 0) {\n <yuv-object-preview [objectId]=\"t.attachments[0].objectId\"></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, PendingChangesService, 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 { TaskComponent } from '../../components/task/task.component';\nimport { Task } from '@yuuvis/app-inbox/shared';\nimport {MasterDetailsLayoutOptions, YuvMasterDetailsComponent} from \"@yuuvis/client-framework/master-details\";\nimport {SortComponent} from '@yuuvis/client-framework/sort';\nimport {catchError, forkJoin, of} from 'rxjs';\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 SortComponent,\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 #pendingChanges = inject(PendingChangesService);\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 sortOptions = signal(this.#setSortOptions());\n storageKey = 'yuv.app.inbox.tasks.sort';\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 #setSortOptions() {\n return ['createTime', 'dueDate'];\n }\n\n fetchAttachments(taskId: string) {\n return this.#inboxService.fetchAttachments(taskId);\n }\n\n fetchTaskForm(taskId: string) {\n return this.#inboxService.fetchTaskForm(taskId).pipe(\n catchError(error => {\n if (error.status === 404) {\n return of(null);\n }\n throw error;\n })\n );\n }\n\n itemSelected(idx: number[]) {\n if (!this.#pendingChanges.check()) {\n const tasks = this.tasks() ?? [];\n const selectedIdx = idx[0];\n\n if (selectedIdx >= 0 && selectedIdx < tasks.length) {\n this.selectedIndex.set(selectedIdx);\n forkJoin({form: this.fetchTaskForm(tasks[selectedIdx].id),\n attachments: this.fetchAttachments(tasks[selectedIdx].id)})\n .subscribe(({form, attachments}) => {\n tasks[selectedIdx].taskForm = form;\n tasks[selectedIdx].attachments = attachments;\n this.task.set(tasks[selectedIdx]);\n })\n } else {\n this.selectedIndex.set(-1);\n this.task.set(null);\n }\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 this.#pendingChanges.clear();\n }\n\n onTaskUpdated() {\n this.#inboxService.fetchTask(this.task()!.id).subscribe((task) => {\n const tasks = this.tasks() ?? [];\n tasks[this.selectedIndex()].variables = task.variables;\n this.task.set(tasks[this.selectedIndex()]);\n this.#pendingChanges.clear();\n });\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(evt: any) {\n this.selectedSort.set(evt.field);\n this.sortOrder.set(evt.order);\n this.#inboxService.applySort(evt.field, evt.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 <yuv-sort [sortOptions]=\"sortOptions()\" [storageKey]=\"storageKey\" (sortChanged)=\"updateSort($event)\"></yuv-sort>\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 @if (!busy() && tasks().length > 0) { @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.processDefinitionId.split(':')[0])\n || i.processDefinitionId.split(':')[0]\"\n [svgIcon]=\"getTaskIconKey(i.processDefinitionId.split(':')[0])\"\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 } } @else {\n <div class=\"empty\">\n <mat-icon>inbox</mat-icon>\n <p>{{isAssigned ? ('io.yuuvis.app.inbox.task.list.empty' | translate) : 'io.yuuvis.app.inbox.task.group.list.empty' | translate\n }}</p>\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()\" (taskUpdated)=\"onTaskUpdated()\" (taskFinished)=\"onTaskFinished()\"></ymi-task>\n } @else if(tasks().length === 0) {\n <div class=\"empty\">\n <mat-icon>no_sim</mat-icon>\n </div>\n } @else {\n <div class=\"empty\">\n <p>{{ \"io.yuuvis.app.inbox.task.details.empty\" | translate }}</p>\n </div>\n }\n </div>\n </ng-template>\n</yuv-master-details>","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":["i1","i4"],"mappings":"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"}
|
package/lib/assets/i18n/de.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"io.yuuvis.app.inbox.task.header.title": "Meine Aufgaben",
|
|
3
3
|
"io.yuuvis.app.inbox.task.header.button.group.selected.title": "Alle Aufgaben anzeigen",
|
|
4
|
-
|
|
5
|
-
|
|
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",
|
|
6
6
|
"io.yuuvis.app.inbox.task.header.button.week.title": "Nach Woche filtern",
|
|
7
7
|
"io.yuuvis.app.inbox.task.header.button.overdue.title": "Nach Überfälligkeit filtern",
|
|
8
8
|
"io.yuuvis.app.inbox.task.header.button.done.title": "Nach Erledigt filtern",
|
|
@@ -10,17 +10,18 @@
|
|
|
10
10
|
"io.yuuvis.app.inbox.task.list.empty": "Genießen Sie Ihre leere Aufgabenliste",
|
|
11
11
|
"io.yuuvis.app.inbox.task.sort.title": "Sortieren",
|
|
12
12
|
"io.yuuvis.app.inbox.task.search": "Aufgaben filtern",
|
|
13
|
+
"io.yuuvis.app.inbox.task.group.list.empty": "Es gibt keine Gruppenaufgaben",
|
|
13
14
|
"io.yuuvis.app.inbox.task.form.title": "Aufgabe",
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
"io.yuuvis.app.inbox.task.footer.button.save": "Speichern",
|
|
16
|
+
"io.yuuvis.app.inbox.task.footer.button.discard": "Änderungen verwerfen",
|
|
16
17
|
"io.yuuvis.app.inbox.task.form.finish": "Beenden",
|
|
17
18
|
"io.yuuvis.app.inbox.task.footer.button.accept": "Aufgabe annehmen",
|
|
18
|
-
|
|
19
|
+
"io.yuuvis.app.inbox.task.footer.button.return": "Aufgabe zurückgeben",
|
|
19
20
|
"io.yuuvis.app.inbox.task.details.tab.label.attachments": "Anhänge",
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
21
|
+
"io.yuuvis.app.inbox.task.duedate.prefix": "Fällig am:",
|
|
22
|
+
"io.yuuvis.app.inbox.task.detail.processDefinition": "Prozessdefinition",
|
|
23
|
+
"io.yuuvis.app.inbox.task.detail.subject": "Betreff",
|
|
24
|
+
"io.yuuvis.app.inbox.task.detail.task": "Aufgabe",
|
|
25
|
+
"io.yuuvis.app.inbox.task.detail.receivedOn": "Empfangen am",
|
|
26
|
+
"io.yuuvis.app.inbox.task.detail.dueDate": "Fällig am"
|
|
27
|
+
}
|
package/lib/assets/i18n/en.json
CHANGED
|
@@ -7,10 +7,11 @@
|
|
|
7
7
|
"io.yuuvis.app.inbox.task.header.button.overdue.title": "Filter by days overdue",
|
|
8
8
|
"io.yuuvis.app.inbox.task.header.button.done.title": "Filter by done",
|
|
9
9
|
"io.yuuvis.app.inbox.task.details.empty": "Select a task",
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
"io.yuuvis.app.inbox.task.list.empty": "Enjoy your task list now that it is empty",
|
|
11
|
+
"io.yuuvis.app.inbox.task.sort.title": "Sort",
|
|
12
12
|
"io.yuuvis.app.inbox.task.search": "Filter tasks",
|
|
13
13
|
"io.yuuvis.app.inbox.task.form.title": "Task",
|
|
14
|
+
"io.yuuvis.app.inbox.task.group.list.empty": "There are no group tasks",
|
|
14
15
|
"io.yuuvis.app.inbox.task.footer.button.save": "Save",
|
|
15
16
|
"io.yuuvis.app.inbox.task.footer.button.discard": "Discard changes",
|
|
16
17
|
"io.yuuvis.app.inbox.task.form.finish": "Finish",
|
|
@@ -18,9 +19,9 @@
|
|
|
18
19
|
"io.yuuvis.app.inbox.task.footer.button.return": "Return task",
|
|
19
20
|
"io.yuuvis.app.inbox.task.details.tab.label.attachments": "Attachments",
|
|
20
21
|
"io.yuuvis.app.inbox.task.duedate.prefix": "Due on:",
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
"io.yuuvis.app.inbox.task.detail.processDefinition": "Process definition",
|
|
23
|
+
"io.yuuvis.app.inbox.task.detail.subject": "Subject",
|
|
24
|
+
"io.yuuvis.app.inbox.task.detail.task": "Task",
|
|
25
|
+
"io.yuuvis.app.inbox.task.detail.receivedOn": "Received on",
|
|
26
|
+
"io.yuuvis.app.inbox.task.detail.duedate": "Due on"
|
|
26
27
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Task } from '@yuuvis/app-inbox/shared';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class BadgeComponent {
|
|
4
|
+
#private;
|
|
5
|
+
task: import("@angular/core").InputSignal<Task>;
|
|
6
|
+
isDateOverdue(dateInput?: string | Date): boolean;
|
|
7
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<BadgeComponent, never>;
|
|
8
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<BadgeComponent, "ymi-badge", never, { "task": { "alias": "task"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
9
|
+
}
|