@yuuvis/client-framework 0.7.4 → 0.9.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.
Files changed (98) hide show
  1. package/actions/lib/actions/delete-action/delete-action.d.ts +1 -0
  2. package/common/index.d.ts +1 -0
  3. package/common/lib/services/error-messages/error-messages.service.d.ts +7 -0
  4. package/common/lib/services/index.d.ts +1 -0
  5. package/esm2022/actions/lib/actions/delete-action/delete-action.mjs +4 -10
  6. package/esm2022/actions/lib/components/contextmenu/contextmenu.component.mjs +2 -2
  7. package/esm2022/common/index.mjs +2 -1
  8. package/esm2022/common/lib/directives/drag-select.directive.mjs +2 -2
  9. package/esm2022/common/lib/services/error-messages/error-messages.service.mjs +68 -0
  10. package/esm2022/common/lib/services/index.mjs +2 -0
  11. package/esm2022/forms/index.mjs +13 -8
  12. package/esm2022/forms/lib/elements/data-grid/data-grid/data-grid.component.mjs +172 -0
  13. package/esm2022/forms/lib/elements/data-grid/edit-table-data/edit-data.component.mjs +95 -0
  14. package/esm2022/forms/lib/elements/data-grid/model/data-grid.interface.mjs +9 -0
  15. package/esm2022/forms/lib/elements/datetime-range/datetime-range.component.mjs +32 -32
  16. package/esm2022/forms/lib/elements/index.mjs +11 -0
  17. package/esm2022/forms/lib/elements/number/number.component.mjs +3 -3
  18. package/esm2022/forms/lib/elements/number-range/number-range.component.mjs +3 -3
  19. package/esm2022/forms/lib/elements/organization/organization.component.mjs +47 -29
  20. package/esm2022/forms/lib/elements/range-select-date/date-range-picker/date-range-picker.component.mjs +38 -0
  21. package/esm2022/forms/lib/elements/range-select-date/range-select-date.component.mjs +181 -0
  22. package/esm2022/forms/lib/elements/range-select-date/range-select-date.interface.mjs +2 -0
  23. package/esm2022/forms/lib/elements/range-select-filesize/range-select-filesize.component.mjs +98 -0
  24. package/esm2022/forms/lib/elements/range-select-filesize/range-select-filesize.interface.mjs +2 -0
  25. package/esm2022/forms/lib/elements/string/string.component.mjs +10 -3
  26. package/esm2022/icons/lib/icons.mjs +3 -2
  27. package/esm2022/list/lib/list.component.mjs +6 -4
  28. package/esm2022/metadata-form/lib/metadata-default-templates/metadata-default-templates.component.mjs +5 -4
  29. package/esm2022/metadata-form/lib/metadata-form-element-registry.service.mjs +1 -1
  30. package/esm2022/metadata-form/lib/metadata-form-field/metadata-form-field.component.mjs +9 -52
  31. package/esm2022/object-details/index.mjs +2 -1
  32. package/esm2022/object-details/lib/object-audit/object-audit.component.mjs +3 -3
  33. package/esm2022/object-details/lib/object-metadata/object-metadata.component.mjs +5 -4
  34. package/esm2022/object-details/lib/retention-badge/retention-badge.component.mjs +27 -0
  35. package/esm2022/object-flavor/lib/object-flavor/object-flavor.component.mjs +2 -2
  36. package/esm2022/object-flavor/lib/object-flavor-picker/object-flavor-picker.component.mjs +2 -2
  37. package/esm2022/object-form/index.mjs +1 -1
  38. package/esm2022/object-form/lib/object-form.component.mjs +2 -1
  39. package/esm2022/object-form/lib/object-form.service.mjs +5 -2
  40. package/esm2022/object-summary/lib/object-summary/object-summary.component.mjs +15 -13
  41. package/esm2022/pagination/lib/pagination.component.mjs +4 -6
  42. package/esm2022/sequence-list/index.mjs +1 -3
  43. package/esm2022/sequence-list/lib/sequence-list.component.mjs +11 -16
  44. package/esm2022/sequence-list/lib/sequence-list.interface.mjs +1 -1
  45. package/esm2022/tile-list/lib/tile/tile.component.mjs +3 -3
  46. package/esm2022/tile-list/lib/tile-config/tile-config.component.mjs +2 -2
  47. package/esm2022/tile-list/lib/tile-extension/extensions/email.extension.mjs +1 -1
  48. package/fesm2022/yuuvis-client-framework-actions.mjs +4 -10
  49. package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -1
  50. package/fesm2022/yuuvis-client-framework-common.mjs +69 -4
  51. package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -1
  52. package/fesm2022/yuuvis-client-framework-forms.mjs +1335 -755
  53. package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
  54. package/fesm2022/yuuvis-client-framework-icons.mjs +2 -1
  55. package/fesm2022/yuuvis-client-framework-icons.mjs.map +1 -1
  56. package/fesm2022/yuuvis-client-framework-list.mjs +5 -3
  57. package/fesm2022/yuuvis-client-framework-list.mjs.map +1 -1
  58. package/fesm2022/yuuvis-client-framework-metadata-form.mjs +12 -55
  59. package/fesm2022/yuuvis-client-framework-metadata-form.mjs.map +1 -1
  60. package/fesm2022/yuuvis-client-framework-object-details.mjs +28 -7
  61. package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -1
  62. package/fesm2022/yuuvis-client-framework-object-flavor.mjs +2 -2
  63. package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -1
  64. package/fesm2022/yuuvis-client-framework-object-form.mjs +5 -1
  65. package/fesm2022/yuuvis-client-framework-object-form.mjs.map +1 -1
  66. package/fesm2022/yuuvis-client-framework-object-summary.mjs +14 -12
  67. package/fesm2022/yuuvis-client-framework-object-summary.mjs.map +1 -1
  68. package/fesm2022/yuuvis-client-framework-pagination.mjs +3 -5
  69. package/fesm2022/yuuvis-client-framework-pagination.mjs.map +1 -1
  70. package/fesm2022/yuuvis-client-framework-sequence-list.mjs +17 -296
  71. package/fesm2022/yuuvis-client-framework-sequence-list.mjs.map +1 -1
  72. package/fesm2022/yuuvis-client-framework-tile-list.mjs +3 -3
  73. package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
  74. package/forms/index.d.ts +5 -7
  75. package/forms/lib/elements/data-grid/data-grid/data-grid.component.d.ts +38 -0
  76. package/forms/lib/elements/data-grid/edit-table-data/edit-data.component.d.ts +21 -0
  77. package/forms/lib/elements/data-grid/model/data-grid.interface.d.ts +14 -0
  78. package/forms/lib/elements/datetime-range/datetime-range.component.d.ts +2 -1
  79. package/forms/lib/elements/index.d.ts +10 -0
  80. package/forms/lib/elements/organization/organization.component.d.ts +13 -4
  81. package/forms/lib/elements/range-select-date/date-range-picker/date-range-picker.component.d.ts +13 -0
  82. package/forms/lib/elements/range-select-date/range-select-date.component.d.ts +33 -0
  83. package/forms/lib/elements/range-select-date/range-select-date.interface.d.ts +5 -0
  84. package/forms/lib/elements/range-select-filesize/range-select-filesize.component.d.ts +28 -0
  85. package/forms/lib/elements/range-select-filesize/range-select-filesize.interface.d.ts +5 -0
  86. package/list/lib/list.component.d.ts +2 -1
  87. package/metadata-form/lib/metadata-form-field/metadata-form-field.component.d.ts +1 -1
  88. package/object-details/index.d.ts +1 -0
  89. package/object-details/lib/retention-badge/retention-badge.component.d.ts +12 -0
  90. package/package.json +10 -10
  91. package/sequence-list/index.d.ts +0 -2
  92. package/sequence-list/lib/sequence-list.component.d.ts +2 -2
  93. package/sequence-list/lib/sequence-list.interface.d.ts +5 -4
  94. package/styles/client-framework.scss +55 -18
  95. package/esm2022/sequence-list/lib/sequence-list-template-manage/sequence-list-template-manage.component.mjs +0 -183
  96. package/esm2022/sequence-list/lib/sequence-list-templates/sequence-list-templates.component.mjs +0 -114
  97. package/sequence-list/lib/sequence-list-template-manage/sequence-list-template-manage.component.d.ts +0 -52
  98. package/sequence-list/lib/sequence-list-templates/sequence-list-templates.component.d.ts +0 -36
@@ -1,21 +1,18 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, viewChild, input, signal, forwardRef, Component, ViewChild, output } from '@angular/core';
3
- import * as i1$1 from '@angular/common';
2
+ import { inject, viewChild, input, signal, forwardRef, Component, ViewChild } from '@angular/core';
4
3
  import { CommonModule } from '@angular/common';
5
4
  import * as i1 from '@yuuvis/components/datepicker';
6
5
  import { YvcDatepickerModule } from '@yuuvis/components/datepicker';
7
6
  import * as i2 from '@yuuvis/components/icon';
8
7
  import { ICONS, YvcIconModule } from '@yuuvis/components/icon';
9
- import { YvcOverlayService, YvcOverlayModule } from '@yuuvis/components/overlay';
10
- import * as i2$2 from '@angular/forms';
11
- import { NG_VALUE_ACCESSOR, NonNullableFormBuilder, Validators, NG_VALIDATORS, ReactiveFormsModule, FormBuilder, FormsModule } from '@angular/forms';
12
- import * as i2$1 from '@yuuvis/client-core';
13
- import { TranslateService, LocaleDatePipe, TranslateModule, BackendService, PendingChangesService, Utils, Sort } from '@yuuvis/client-core';
8
+ import { YvcOverlayService } from '@yuuvis/components/overlay';
9
+ import * as i2$1 from '@angular/forms';
10
+ import { NG_VALUE_ACCESSOR, NonNullableFormBuilder, Validators, NG_VALIDATORS, ReactiveFormsModule } from '@angular/forms';
11
+ import * as i1$1 from '@yuuvis/client-core';
12
+ import { TranslateService, LocaleDatePipe, TranslateModule } from '@yuuvis/client-core';
14
13
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
15
- import { OrganizationComponent, FormInputComponent, StringComponent, YuvFormsModule } from '@yuuvis/client-framework/forms';
14
+ import { OrganizationComponent } from '@yuuvis/client-framework/forms';
16
15
  import { YUV_ICONS } from '@yuuvis/client-framework/icons';
17
- import * as i4 from '@yuuvis/components/common';
18
- import { YvcCommonModule } from '@yuuvis/components/common';
19
16
 
20
17
  class DueDatePickerComponent {
21
18
  constructor() {
@@ -130,6 +127,7 @@ class SequenceListComponent {
130
127
  items: this.#fb.array([this.#generateSequenceItem()])
131
128
  });
132
129
  this.entries = [];
130
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
133
131
  this.propagateChange = (_) => { };
134
132
  this.sequenceForm.valueChanges.pipe(takeUntilDestroyed()).subscribe(() => {
135
133
  this.#propagate();
@@ -138,7 +136,7 @@ class SequenceListComponent {
138
136
  #generateSequenceItem(sequenceItem) {
139
137
  return this.#fb.group({
140
138
  title: [sequenceItem?.title || '', Validators.required],
141
- nextAssignee: [sequenceItem?.nextAssignee.id || '', Validators.required],
139
+ nextAssignee: [sequenceItem?.nextAssignee || '', Validators.required],
142
140
  expiryDatetime: [sequenceItem?.expiryDatetime || undefined]
143
141
  });
144
142
  }
@@ -158,6 +156,7 @@ class SequenceListComponent {
158
156
  const ml = this.maxLength();
159
157
  this.maxLengthExceeded = ml !== undefined && this.formItemArray.length >= ml;
160
158
  }
159
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
161
160
  registerOnTouched() { }
162
161
  #propagate() {
163
162
  const res = [];
@@ -175,6 +174,9 @@ class SequenceListComponent {
175
174
  }
176
175
  writeValue(value) {
177
176
  this.entries = value || [];
177
+ this.formItemArray.clear();
178
+ if (this.entries.length === 0)
179
+ this.addItem();
178
180
  this.entries.forEach((entry) => {
179
181
  this.formItemArray.push(this.#generateSequenceItem(entry));
180
182
  });
@@ -207,20 +209,11 @@ class SequenceListComponent {
207
209
  useExisting: forwardRef(() => SequenceListComponent),
208
210
  multi: true
209
211
  }
210
- ], viewQueries: [{ propertyName: "orgComponent", first: true, predicate: OrganizationComponent, descendants: true }], ngImport: i0, template: "<form [formGroup]=\"sequenceForm\">\n <section formArrayName=\"items\">\n @for (item of sequenceForm.controls.items.controls; track itemIndex; let itemIndex = $index) {\n <div class=\"item\" [formGroup]=\"item\">\n <button class=\"add before\" type=\"button\" [disabled]=\"maxLengthExceeded\" (click)=\"addItemAt($index)\"><yvc-icon [svg]=\"icons.add\"></yvc-icon></button>\n <span class=\"index\" [attr.data-index]=\"itemIndex + 1\"></span>\n\n <div class=\"item-form\">\n <button class=\"remove\" type=\"button\" (click)=\"removeItem($index)\"\n [disabled]=\"sequenceForm.controls.items.controls.length === 1\"><yvc-icon [svg]=\"icons.delete\"></yvc-icon></button>\n <input [placeholder]=\"'yuv.sequence-list.form.task' | translate\" [maxLength]=\"128\" formControlName=\"title\" />\n <yuv-organization\n [title]=\"'yuv.sequence-list.form.nextAssignee' | translate\"\n [withMetadata]=\"true\"\n formControlName=\"nextAssignee\"> </yuv-organization>\n \n <!-- <yuv-due-date-picker \n [title]=\"'yuv.sequence-list.form.expiryDatetime' | translate\"\n formControlName=\"expiryDatetime\"></yuv-due-date-picker> -->\n </div>\n @if ($last) {\n <button class=\"add after\" type=\"button\" \n [disabled]=\"maxLengthExceeded\"\n (click)=\"addItem()\"><yvc-icon [svg]=\"icons.add\"></yvc-icon></button>\n }\n </div>\n }\n </section>\n</form>\n", styles: [":host{--yvc-form-element-border-color: var(--form-element-border-color, var(--text-color-hint));--yvc-form-element-focus-border-color: var(--form-element-focus-border-color, var(--color-accent));--yvc-form-element-focus-outline-color: var(--form-element-focus-outline-color, rgba(var(--color-accent-rgb), .3));--yvc-form-element-focus-outline-with: var(--form-element-focus-outline-with, 2px);--yvc-form-element-disabled-background-color: var(--form-element-disabled-background-color, rgba(from var(--text-color-body) r g b / .1));--yvc-form-element-disabled-opacity: var(--form-element-disabled-opacity, .8);--_sequence-list-item-background: var(--sequence-list-item-background, var(--panel-background));--_sequence-list-item-border-color: var(--sequence-list-item-border-color, var(--panel-divider-color));--_sequence-list-item-border-radius: var(--sequence-list-item-border-radius, calc(var(--app-pane-padding) / 2));--_sequence-list-line-color: var(--sequence-list-line-color, var(--text-color-hint));--_sequence-list-line-width: var(--sequence-list-line-width, 2px);--_sequence-list-line-item-background: var(--sequence-list-line-item-background, var(--panel-background-lightgrey));--_sequence-list-line-item-border-radius: var(--sequence-list-line-item-border-radius, .25em)}:host form section{margin-inline-end:4px}:host form section button.add{--icon-size: 18px;border-radius:var(--_sequence-list-line-item-border-radius);padding:0;display:flex;align-items:center;justify-content:center;background-color:var(--_sequence-list-line-item-background);border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section button.add:focus{outline:2px solid rgb(from var(--color-accent) r g b/.5);outline-offset:-2px;border-color:var(--color-accent)}:host form section .item{display:grid;grid-template-columns:6ch 1fr;grid-template-rows:auto auto;column-gap:1em;grid-template-areas:\"addBefore .\" \"index form\" \"addAfter .\"}:host form section .item.ng-invalid.ng-dirty .item-form{border-color:var(--color-error);outline:3px solid rgb(from var(--color-error) r g b/.5)}:host form section .item .add.before{grid-area:addBefore;justify-self:center}:host form section .item .add.after{grid-area:addAfter;justify-self:center}:host form section .item .index{grid-area:index;display:grid;align-items:center;justify-content:center}:host form section .item .index:after{content:attr(data-index);grid-row:1;grid-column:1;background-color:var(--_sequence-list-line-item-background);font-size:var(--font-hint);color:var(--text-color-caption);font-weight:700;border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color);border-radius:var(--_sequence-list-line-item-border-radius);line-height:1em;padding:1px .25em;outline:3px solid rgb(from var(--_sequence-list-line-color) r g b/.1)}:host form section .item .index:before{content:\"\";grid-row:1;grid-column:1;height:100%;width:calc(50% - var(--_sequence-list-line-width) / 2);border-inline-end:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section .item .item-form{grid-area:form;background-color:var(--_sequence-list-item-background);border:1px solid var(--_sequence-list-item-border-color);border-radius:var(--_sequence-list-item-border-radius);padding:calc(var(--app-pane-padding) / 2);display:grid;column-gap:var(--app-pane-padding);row-gap:4px;grid-template-columns:1fr auto;grid-template-rows:repeat(3,auto);grid-template-areas:\"task remove\" \"user user\" \"date date\"}:host form section .item .item-form input{border:1px solid transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);grid-area:task;outline-offset:0;line-height:1em;padding:calc(var(--app-pane-padding) / 4);background-color:transparent;color:var(--text-color-body)}:host form section .item .item-form input:focus{border-color:var(--yvc-form-element-focus-border-color);outline:var(--yvc-form-element-focus-outline-with) solid var(--yvc-form-element-focus-outline-color)}:host form section .item .item-form yvc-datepicker{--form-element-border-color: transparent;grid-area:date;padding:0;flex-flow:row-reverse}:host form section .item .item-form yuv-organization{--form-element-border-color: transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);border:1px solid var(--form-element-border-color);grid-area:user;flex-flow:row-reverse}:host form section .item .item-form yuv-organization:focus-within{border-color:var(--yvc-form-element-focus-border-color);outline:var(--yvc-form-element-focus-outline-with) solid var(--yvc-form-element-focus-outline-color)}:host form section .item .item-form .remove{--icon-size: 18px;padding:calc(var(--app-pane-padding) / 4);grid-area:remove;padding:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }, { kind: "component", type: OrganizationComponent, selector: "yuv-organization", inputs: ["placeholder", "situation", "multiselect", "classifications", "readonly", "autofocus", "appendTo", "excludeMe", "withMetadata"], outputs: ["userSelect"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2$2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: YvcIconModule }, { kind: "component", type: i2.Icon, selector: "yvc-icon", inputs: ["label", "svg", "svgSrc"] }] }); }
212
+ ], viewQueries: [{ propertyName: "orgComponent", first: true, predicate: OrganizationComponent, descendants: true }], ngImport: i0, template: "<form [formGroup]=\"sequenceForm\">\n <section formArrayName=\"items\">\n @for (item of sequenceForm.controls.items.controls; track itemIndex; let itemIndex = $index) {\n <div class=\"item\" [formGroup]=\"item\">\n <button class=\"add before\" type=\"button\" [disabled]=\"maxLengthExceeded\" (click)=\"addItemAt($index)\"><yvc-icon [svg]=\"icons.add\"></yvc-icon></button>\n <span class=\"index\" [attr.data-index]=\"itemIndex + 1\"></span>\n\n <div class=\"item-form\">\n <button class=\"remove\" type=\"button\" (click)=\"removeItem($index)\" [disabled]=\"sequenceForm.controls.items.controls.length === 1\">\n <yvc-icon [svg]=\"icons.delete\"></yvc-icon>\n </button>\n <input [placeholder]=\"'yuv.sequence-list.form.task' | translate\" [maxLength]=\"128\" formControlName=\"title\" />\n <yuv-organization [title]=\"'yuv.sequence-list.form.nextAssignee' | translate\" [withMetadata]=\"true\" formControlName=\"nextAssignee\">\n </yuv-organization>\n </div>\n @if ($last) {\n <button class=\"add after\" type=\"button\" [disabled]=\"maxLengthExceeded\" (click)=\"addItem()\"><yvc-icon [svg]=\"icons.add\"></yvc-icon></button>\n }\n </div>\n }\n </section>\n</form>\n", styles: [":host{--yvc-form-element-border-color: var(--form-element-border-color, var(--text-color-hint));--yvc-form-element-focus-border-color: var(--form-element-focus-border-color, var(--color-accent));--yvc-form-element-focus-outline-color: var(--form-element-focus-outline-color, rgba(var(--color-accent-rgb), .3));--yvc-form-element-focus-outline-with: var(--form-element-focus-outline-with, 2px);--yvc-form-element-disabled-background-color: var(--form-element-disabled-background-color, rgba(from var(--text-color-body) r g b / .1));--yvc-form-element-disabled-opacity: var(--form-element-disabled-opacity, .8);--_sequence-list-item-background: var(--sequence-list-item-background, var(--panel-background));--_sequence-list-item-border-color: var(--sequence-list-item-border-color, var(--panel-divider-color));--_sequence-list-item-border-radius: var(--sequence-list-item-border-radius, calc(var(--app-pane-padding) / 2));--_sequence-list-line-color: var(--sequence-list-line-color, var(--text-color-hint));--_sequence-list-line-width: var(--sequence-list-line-width, 2px);--_sequence-list-line-item-background: var(--sequence-list-line-item-background, var(--panel-background-lightgrey));--_sequence-list-line-item-border-radius: var(--sequence-list-line-item-border-radius, .25em)}:host form section{margin-inline-end:4px}:host form section button.add{--icon-size: 18px;border-radius:var(--_sequence-list-line-item-border-radius);padding:0;display:flex;align-items:center;justify-content:center;background-color:var(--_sequence-list-line-item-background);border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section button.add:focus{outline:2px solid rgb(from var(--color-accent) r g b/.5);outline-offset:-2px;border-color:var(--color-accent)}:host form section .item{display:grid;grid-template-columns:6ch 1fr;grid-template-rows:auto auto;column-gap:1em;grid-template-areas:\"addBefore .\" \"index form\" \"addAfter .\"}:host form section .item.ng-invalid.ng-dirty .item-form{border-color:var(--color-error);outline:3px solid rgb(from var(--color-error) r g b/.5)}:host form section .item .add.before{grid-area:addBefore;justify-self:center}:host form section .item .add.after{grid-area:addAfter;justify-self:center}:host form section .item .index{grid-area:index;display:grid;align-items:center;justify-content:center}:host form section .item .index:after{content:attr(data-index);grid-row:1;grid-column:1;background-color:var(--_sequence-list-line-item-background);font-size:var(--font-hint);color:var(--text-color-caption);font-weight:700;border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color);border-radius:var(--_sequence-list-line-item-border-radius);line-height:1em;padding:1px .25em;outline:3px solid rgb(from var(--_sequence-list-line-color) r g b/.1)}:host form section .item .index:before{content:\"\";grid-row:1;grid-column:1;height:100%;width:calc(50% - var(--_sequence-list-line-width) / 2);border-inline-end:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section .item .item-form{grid-area:form;background-color:var(--_sequence-list-item-background);border:1px solid var(--_sequence-list-item-border-color);border-radius:var(--_sequence-list-item-border-radius);padding:calc(var(--app-pane-padding) / 2);display:grid;column-gap:var(--app-pane-padding);row-gap:4px;grid-template-columns:1fr auto;grid-template-rows:repeat(3,auto);grid-template-areas:\"task remove\" \"user user\" \"date date\"}:host form section .item .item-form input{border:1px solid transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);grid-area:task;outline-offset:0;line-height:1em;padding:calc(var(--app-pane-padding) / 4);background-color:transparent;color:var(--text-color-body)}:host form section .item .item-form input:focus{border-color:var(--yvc-form-element-focus-border-color);outline:var(--yvc-form-element-focus-outline-with) solid var(--yvc-form-element-focus-outline-color)}:host form section .item .item-form yvc-datepicker{--form-element-border-color: transparent;grid-area:date;padding:0;flex-flow:row-reverse}:host form section .item .item-form yuv-organization{--form-element-border-color: transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);border:1px solid var(--form-element-border-color);grid-area:user;flex-flow:row-reverse}:host form section .item .item-form yuv-organization:focus-within{border-color:var(--yvc-form-element-focus-border-color);outline:var(--yvc-form-element-focus-outline-with) solid var(--yvc-form-element-focus-outline-color)}:host form section .item .item-form .remove{--icon-size: 18px;padding:calc(var(--app-pane-padding) / 4);grid-area:remove;padding:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "component", type: OrganizationComponent, selector: "yuv-organization", inputs: ["placeholder", "situation", "multiselect", "classifications", "readonly", "autofocus", "appendTo", "excludeMe", "withMetadata"], outputs: ["userSelect"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2$1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: YvcIconModule }, { kind: "component", type: i2.Icon, selector: "yvc-icon", inputs: ["label", "svg", "svgSrc"] }] }); }
211
213
  }
212
214
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SequenceListComponent, decorators: [{
213
215
  type: Component,
214
- args: [{ selector: 'yuv-sequence-list', standalone: true, imports: [
215
- CommonModule,
216
- TranslateModule,
217
- FormInputComponent,
218
- StringComponent,
219
- OrganizationComponent,
220
- DueDatePickerComponent,
221
- ReactiveFormsModule,
222
- YvcIconModule
223
- ], providers: [
216
+ args: [{ selector: 'yuv-sequence-list', standalone: true, imports: [CommonModule, TranslateModule, OrganizationComponent, ReactiveFormsModule, YvcIconModule], providers: [
224
217
  {
225
218
  provide: NG_VALUE_ACCESSOR,
226
219
  useExisting: forwardRef(() => SequenceListComponent),
@@ -233,287 +226,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
233
226
  }
234
227
  ], host: {
235
228
  tabindex: '0'
236
- }, template: "<form [formGroup]=\"sequenceForm\">\n <section formArrayName=\"items\">\n @for (item of sequenceForm.controls.items.controls; track itemIndex; let itemIndex = $index) {\n <div class=\"item\" [formGroup]=\"item\">\n <button class=\"add before\" type=\"button\" [disabled]=\"maxLengthExceeded\" (click)=\"addItemAt($index)\"><yvc-icon [svg]=\"icons.add\"></yvc-icon></button>\n <span class=\"index\" [attr.data-index]=\"itemIndex + 1\"></span>\n\n <div class=\"item-form\">\n <button class=\"remove\" type=\"button\" (click)=\"removeItem($index)\"\n [disabled]=\"sequenceForm.controls.items.controls.length === 1\"><yvc-icon [svg]=\"icons.delete\"></yvc-icon></button>\n <input [placeholder]=\"'yuv.sequence-list.form.task' | translate\" [maxLength]=\"128\" formControlName=\"title\" />\n <yuv-organization\n [title]=\"'yuv.sequence-list.form.nextAssignee' | translate\"\n [withMetadata]=\"true\"\n formControlName=\"nextAssignee\"> </yuv-organization>\n \n <!-- <yuv-due-date-picker \n [title]=\"'yuv.sequence-list.form.expiryDatetime' | translate\"\n formControlName=\"expiryDatetime\"></yuv-due-date-picker> -->\n </div>\n @if ($last) {\n <button class=\"add after\" type=\"button\" \n [disabled]=\"maxLengthExceeded\"\n (click)=\"addItem()\"><yvc-icon [svg]=\"icons.add\"></yvc-icon></button>\n }\n </div>\n }\n </section>\n</form>\n", styles: [":host{--yvc-form-element-border-color: var(--form-element-border-color, var(--text-color-hint));--yvc-form-element-focus-border-color: var(--form-element-focus-border-color, var(--color-accent));--yvc-form-element-focus-outline-color: var(--form-element-focus-outline-color, rgba(var(--color-accent-rgb), .3));--yvc-form-element-focus-outline-with: var(--form-element-focus-outline-with, 2px);--yvc-form-element-disabled-background-color: var(--form-element-disabled-background-color, rgba(from var(--text-color-body) r g b / .1));--yvc-form-element-disabled-opacity: var(--form-element-disabled-opacity, .8);--_sequence-list-item-background: var(--sequence-list-item-background, var(--panel-background));--_sequence-list-item-border-color: var(--sequence-list-item-border-color, var(--panel-divider-color));--_sequence-list-item-border-radius: var(--sequence-list-item-border-radius, calc(var(--app-pane-padding) / 2));--_sequence-list-line-color: var(--sequence-list-line-color, var(--text-color-hint));--_sequence-list-line-width: var(--sequence-list-line-width, 2px);--_sequence-list-line-item-background: var(--sequence-list-line-item-background, var(--panel-background-lightgrey));--_sequence-list-line-item-border-radius: var(--sequence-list-line-item-border-radius, .25em)}:host form section{margin-inline-end:4px}:host form section button.add{--icon-size: 18px;border-radius:var(--_sequence-list-line-item-border-radius);padding:0;display:flex;align-items:center;justify-content:center;background-color:var(--_sequence-list-line-item-background);border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section button.add:focus{outline:2px solid rgb(from var(--color-accent) r g b/.5);outline-offset:-2px;border-color:var(--color-accent)}:host form section .item{display:grid;grid-template-columns:6ch 1fr;grid-template-rows:auto auto;column-gap:1em;grid-template-areas:\"addBefore .\" \"index form\" \"addAfter .\"}:host form section .item.ng-invalid.ng-dirty .item-form{border-color:var(--color-error);outline:3px solid rgb(from var(--color-error) r g b/.5)}:host form section .item .add.before{grid-area:addBefore;justify-self:center}:host form section .item .add.after{grid-area:addAfter;justify-self:center}:host form section .item .index{grid-area:index;display:grid;align-items:center;justify-content:center}:host form section .item .index:after{content:attr(data-index);grid-row:1;grid-column:1;background-color:var(--_sequence-list-line-item-background);font-size:var(--font-hint);color:var(--text-color-caption);font-weight:700;border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color);border-radius:var(--_sequence-list-line-item-border-radius);line-height:1em;padding:1px .25em;outline:3px solid rgb(from var(--_sequence-list-line-color) r g b/.1)}:host form section .item .index:before{content:\"\";grid-row:1;grid-column:1;height:100%;width:calc(50% - var(--_sequence-list-line-width) / 2);border-inline-end:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section .item .item-form{grid-area:form;background-color:var(--_sequence-list-item-background);border:1px solid var(--_sequence-list-item-border-color);border-radius:var(--_sequence-list-item-border-radius);padding:calc(var(--app-pane-padding) / 2);display:grid;column-gap:var(--app-pane-padding);row-gap:4px;grid-template-columns:1fr auto;grid-template-rows:repeat(3,auto);grid-template-areas:\"task remove\" \"user user\" \"date date\"}:host form section .item .item-form input{border:1px solid transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);grid-area:task;outline-offset:0;line-height:1em;padding:calc(var(--app-pane-padding) / 4);background-color:transparent;color:var(--text-color-body)}:host form section .item .item-form input:focus{border-color:var(--yvc-form-element-focus-border-color);outline:var(--yvc-form-element-focus-outline-with) solid var(--yvc-form-element-focus-outline-color)}:host form section .item .item-form yvc-datepicker{--form-element-border-color: transparent;grid-area:date;padding:0;flex-flow:row-reverse}:host form section .item .item-form yuv-organization{--form-element-border-color: transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);border:1px solid var(--form-element-border-color);grid-area:user;flex-flow:row-reverse}:host form section .item .item-form yuv-organization:focus-within{border-color:var(--yvc-form-element-focus-border-color);outline:var(--yvc-form-element-focus-outline-with) solid var(--yvc-form-element-focus-outline-color)}:host form section .item .item-form .remove{--icon-size: 18px;padding:calc(var(--app-pane-padding) / 4);grid-area:remove;padding:0}\n"] }]
229
+ }, template: "<form [formGroup]=\"sequenceForm\">\n <section formArrayName=\"items\">\n @for (item of sequenceForm.controls.items.controls; track itemIndex; let itemIndex = $index) {\n <div class=\"item\" [formGroup]=\"item\">\n <button class=\"add before\" type=\"button\" [disabled]=\"maxLengthExceeded\" (click)=\"addItemAt($index)\"><yvc-icon [svg]=\"icons.add\"></yvc-icon></button>\n <span class=\"index\" [attr.data-index]=\"itemIndex + 1\"></span>\n\n <div class=\"item-form\">\n <button class=\"remove\" type=\"button\" (click)=\"removeItem($index)\" [disabled]=\"sequenceForm.controls.items.controls.length === 1\">\n <yvc-icon [svg]=\"icons.delete\"></yvc-icon>\n </button>\n <input [placeholder]=\"'yuv.sequence-list.form.task' | translate\" [maxLength]=\"128\" formControlName=\"title\" />\n <yuv-organization [title]=\"'yuv.sequence-list.form.nextAssignee' | translate\" [withMetadata]=\"true\" formControlName=\"nextAssignee\">\n </yuv-organization>\n </div>\n @if ($last) {\n <button class=\"add after\" type=\"button\" [disabled]=\"maxLengthExceeded\" (click)=\"addItem()\"><yvc-icon [svg]=\"icons.add\"></yvc-icon></button>\n }\n </div>\n }\n </section>\n</form>\n", styles: [":host{--yvc-form-element-border-color: var(--form-element-border-color, var(--text-color-hint));--yvc-form-element-focus-border-color: var(--form-element-focus-border-color, var(--color-accent));--yvc-form-element-focus-outline-color: var(--form-element-focus-outline-color, rgba(var(--color-accent-rgb), .3));--yvc-form-element-focus-outline-with: var(--form-element-focus-outline-with, 2px);--yvc-form-element-disabled-background-color: var(--form-element-disabled-background-color, rgba(from var(--text-color-body) r g b / .1));--yvc-form-element-disabled-opacity: var(--form-element-disabled-opacity, .8);--_sequence-list-item-background: var(--sequence-list-item-background, var(--panel-background));--_sequence-list-item-border-color: var(--sequence-list-item-border-color, var(--panel-divider-color));--_sequence-list-item-border-radius: var(--sequence-list-item-border-radius, calc(var(--app-pane-padding) / 2));--_sequence-list-line-color: var(--sequence-list-line-color, var(--text-color-hint));--_sequence-list-line-width: var(--sequence-list-line-width, 2px);--_sequence-list-line-item-background: var(--sequence-list-line-item-background, var(--panel-background-lightgrey));--_sequence-list-line-item-border-radius: var(--sequence-list-line-item-border-radius, .25em)}:host form section{margin-inline-end:4px}:host form section button.add{--icon-size: 18px;border-radius:var(--_sequence-list-line-item-border-radius);padding:0;display:flex;align-items:center;justify-content:center;background-color:var(--_sequence-list-line-item-background);border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section button.add:focus{outline:2px solid rgb(from var(--color-accent) r g b/.5);outline-offset:-2px;border-color:var(--color-accent)}:host form section .item{display:grid;grid-template-columns:6ch 1fr;grid-template-rows:auto auto;column-gap:1em;grid-template-areas:\"addBefore .\" \"index form\" \"addAfter .\"}:host form section .item.ng-invalid.ng-dirty .item-form{border-color:var(--color-error);outline:3px solid rgb(from var(--color-error) r g b/.5)}:host form section .item .add.before{grid-area:addBefore;justify-self:center}:host form section .item .add.after{grid-area:addAfter;justify-self:center}:host form section .item .index{grid-area:index;display:grid;align-items:center;justify-content:center}:host form section .item .index:after{content:attr(data-index);grid-row:1;grid-column:1;background-color:var(--_sequence-list-line-item-background);font-size:var(--font-hint);color:var(--text-color-caption);font-weight:700;border:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color);border-radius:var(--_sequence-list-line-item-border-radius);line-height:1em;padding:1px .25em;outline:3px solid rgb(from var(--_sequence-list-line-color) r g b/.1)}:host form section .item .index:before{content:\"\";grid-row:1;grid-column:1;height:100%;width:calc(50% - var(--_sequence-list-line-width) / 2);border-inline-end:var(--_sequence-list-line-width) solid var(--_sequence-list-line-color)}:host form section .item .item-form{grid-area:form;background-color:var(--_sequence-list-item-background);border:1px solid var(--_sequence-list-item-border-color);border-radius:var(--_sequence-list-item-border-radius);padding:calc(var(--app-pane-padding) / 2);display:grid;column-gap:var(--app-pane-padding);row-gap:4px;grid-template-columns:1fr auto;grid-template-rows:repeat(3,auto);grid-template-areas:\"task remove\" \"user user\" \"date date\"}:host form section .item .item-form input{border:1px solid transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);grid-area:task;outline-offset:0;line-height:1em;padding:calc(var(--app-pane-padding) / 4);background-color:transparent;color:var(--text-color-body)}:host form section .item .item-form input:focus{border-color:var(--yvc-form-element-focus-border-color);outline:var(--yvc-form-element-focus-outline-with) solid var(--yvc-form-element-focus-outline-color)}:host form section .item .item-form yvc-datepicker{--form-element-border-color: transparent;grid-area:date;padding:0;flex-flow:row-reverse}:host form section .item .item-form yuv-organization{--form-element-border-color: transparent;border-radius:calc(var(--_sequence-list-item-border-radius) / 2);border:1px solid var(--form-element-border-color);grid-area:user;flex-flow:row-reverse}:host form section .item .item-form yuv-organization:focus-within{border-color:var(--yvc-form-element-focus-border-color);outline:var(--yvc-form-element-focus-outline-with) solid var(--yvc-form-element-focus-outline-color)}:host form section .item .item-form .remove{--icon-size: 18px;padding:calc(var(--app-pane-padding) / 4);grid-area:remove;padding:0}\n"] }]
237
230
  }], ctorParameters: () => [], propDecorators: { orgComponent: [{
238
231
  type: ViewChild,
239
232
  args: [OrganizationComponent]
240
233
  }] } });
241
234
 
242
- class SequenceListTemplateManageComponent {
243
- set selectedTemplate(s) {
244
- if (!this.pendingChanges.check()) {
245
- this.pendingTaskId = undefined;
246
- this._selectedTemplate = s ? { ...s } : undefined;
247
- if (this._selectedTemplate)
248
- this.form.patchValue({
249
- templateName: this._selectedTemplate.id === this.CURRENT_ENTRIES_ID ? '' : this._selectedTemplate.name,
250
- sequence: [...this._selectedTemplate.sequence]
251
- }, { emitEvent: false });
252
- this.form.markAsPristine();
253
- }
254
- }
255
- get selectedTemplate() {
256
- return this._selectedTemplate;
257
- }
258
- get formErrors() {
259
- const errors = this.form.get('templateName')?.errors;
260
- return errors ? Object.keys(errors).map((k) => this.labels.errors[k]) : [];
261
- }
262
- constructor() {
263
- this.backend = inject(BackendService);
264
- this.overlay = inject(YvcOverlayService);
265
- this.pendingChanges = inject(PendingChangesService);
266
- this.fb = inject(FormBuilder);
267
- this.translate = inject(TranslateService);
268
- this.DEFAULT_TEMPLATE_STORAGE_SECTION = 'sequencelist';
269
- this.CURRENT_ENTRIES_ID = 'current';
270
- this.TEMPLATE_NAME_MAX_LENGTH = 128;
271
- this.disableSubmit = false;
272
- this.templates = [];
273
- this.filterTerm = null;
274
- this.busy = false;
275
- this.form = this.fb.group({
276
- templateName: ['', [Validators.required, Validators.maxLength(this.TEMPLATE_NAME_MAX_LENGTH), this.forbiddenNameValidator()]],
277
- sequence: [[], Validators.required]
278
- });
279
- /**
280
- * Name of the section to store templates in user service (usersettings)
281
- */
282
- this.storageSection = input(this.DEFAULT_TEMPLATE_STORAGE_SECTION);
283
- this.currentEntries = input([]);
284
- // emitted once a template has been selected
285
- this.templateSelect = output();
286
- this.cancel = output();
287
- this.labels = {
288
- save: this.translate.instant('yuv.sequence-list.template.button.save'),
289
- saveNew: this.translate.instant('yuv.sequence-list.template.button.saveNew'),
290
- headline: this.translate.instant('yuv.sequence-list.template.headline'),
291
- headlineNew: this.translate.instant('yuv.sequence-list.template.headlineNew'),
292
- errors: {
293
- maxlength: this.translate.instant('yuv.object-form-element.error.maxlength', { maxLength: this.TEMPLATE_NAME_MAX_LENGTH }),
294
- forbiddenName: this.translate.instant('yuv.sequence-list.template.errors.forbiddenName')
295
- }
296
- };
297
- this.form.statusChanges.pipe(takeUntilDestroyed()).subscribe((res) => {
298
- if (this.form.dirty && !this.pendingChanges.hasPendingTask(this.pendingTaskId || ' ')) {
299
- this.pendingTaskId = this.pendingChanges.startTask(this.translate.instant('yuv.sequence-list.template.pending-changes.alert'));
300
- }
301
- });
302
- }
303
- forbiddenNameValidator() {
304
- return (control) => {
305
- const forbidden = this.templates
306
- .filter((t) => t.id !== this.selectedTemplate.id)
307
- .map((t) => t.name)
308
- .includes(control.value);
309
- return forbidden ? { forbiddenName: { value: control.value } } : null;
310
- };
311
- }
312
- selectCurrentEntries() {
313
- this.selectedTemplate = {
314
- id: this.CURRENT_ENTRIES_ID,
315
- name: this.translate.instant('yuv.sequence-list.template.headlineNew'),
316
- sequence: this.currentEntries() || []
317
- };
318
- }
319
- applyTemplate() {
320
- if (this.selectedTemplate)
321
- this.templateSelect.emit(this.selectedTemplate.sequence);
322
- }
323
- deleteTemplate() {
324
- this.overlay
325
- .confirm({
326
- message: this.translate.instant('yuv.sequence-list.template.remove.confirm.message', {
327
- template: this.selectedTemplate.name
328
- })
329
- })
330
- .subscribe((confirmed) => {
331
- if (confirmed) {
332
- this.templates = this.templates.filter((t) => t.id !== this.selectedTemplate.id);
333
- this.saveTemplates();
334
- }
335
- });
336
- }
337
- submit() {
338
- if (this.selectedTemplate) {
339
- let selectAfterSave;
340
- if (this.selectedTemplate.id === this.CURRENT_ENTRIES_ID) {
341
- // save current list as new template
342
- const id = Utils.uuid();
343
- this.templates.push({
344
- id,
345
- name: this.form.value.templateName,
346
- sequence: this.form.value.sequence
347
- });
348
- selectAfterSave = id;
349
- }
350
- else {
351
- // update existing template
352
- const i = this.templates.findIndex((e) => e.id === this.selectedTemplate.id);
353
- if (i !== -1) {
354
- this.templates[i] = {
355
- id: this.selectedTemplate.id,
356
- name: this.form.value.templateName,
357
- sequence: this.form.value.sequence
358
- };
359
- selectAfterSave = this.selectedTemplate.id;
360
- }
361
- }
362
- this.saveTemplates(selectAfterSave);
363
- }
364
- }
365
- saveTemplates(templateToBeSelectedAfterSave) {
366
- this.busy = true;
367
- this.templates.sort(Utils.sortValues('name', Sort.ASC));
368
- return this.backend.post(`/users/settings/${this.storageSection}`, { templates: this.templates }).subscribe((res) => {
369
- this.busy = false;
370
- this.form.markAsPristine();
371
- if (this.pendingTaskId)
372
- this.pendingChanges.finishTask(this.pendingTaskId);
373
- if (!templateToBeSelectedAfterSave) {
374
- this.selectedTemplate = undefined;
375
- }
376
- else if (templateToBeSelectedAfterSave !== this.selectedTemplate.id) {
377
- this.selectedTemplate = this.templates.find((t) => templateToBeSelectedAfterSave === t.id);
378
- }
379
- }, (err) => (this.busy = false));
380
- }
381
- loadTemplates() {
382
- this.backend.get(`/users/settings/${this.storageSection()}`).subscribe((res) => {
383
- this.templates = res ? res.templates || [] : [];
384
- this.templates.sort(Utils.sortValues('name', Sort.ASC));
385
- this.selectCurrentEntries();
386
- });
387
- }
388
- ngOnInit() {
389
- this.loadTemplates();
390
- }
391
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SequenceListTemplateManageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
392
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SequenceListTemplateManageComponent, isStandalone: true, selector: "yuv-sequence-list-template-manage", inputs: { storageSection: { classPropertyName: "storageSection", publicName: "storageSection", isSignal: true, isRequired: false, transformFunction: null }, currentEntries: { classPropertyName: "currentEntries", publicName: "currentEntries", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { templateSelect: "templateSelect", cancel: "cancel" }, ngImport: i0, template: "<div class=\"template-list\">\n <header>{{ 'yuv.sequence-list.template-list.headline' | translate }}</header>\n\n <!-- current entries -->\n <div class=\"currententries item\" (click)=\"selectCurrentEntries()\" [ngClass]=\"{ current: selectedTemplate?.id === CURRENT_ENTRIES_ID }\">\n {{ 'yuv.sequence-list.template.headlineNew' | translate }}\n </div>\n\n <div class=\"filter\">\n <yuv-form-input [label]=\"'yuv.sequence-list.form.filter' | translate\">\n <yuv-string [(ngModel)]=\"filterTerm\"> </yuv-string>\n </yuv-form-input>\n </div>\n\n <div class=\"templates\">\n @for (tpl of templates | filter: filterTerm : 'name'; track $index) {\n <div class=\"item\" (click)=\"selectedTemplate = tpl\" [ngClass]=\"{ current: selectedTemplate?.id === tpl.id }\">\n {{ tpl.name }}\n </div>\n }\n </div>\n</div>\n\n@if (selectedTemplate) {\n <form class=\"template\" [formGroup]=\"form\">\n <header>{{ selectedTemplate.id !== CURRENT_ENTRIES_ID ? labels.headline : labels.headlineNew }}</header>\n\n <yuv-form-input [label]=\"'yuv.sequence-list.form.templateName' | translate\" [required]=\"true\" [invalid]=\"!!formErrors.length\">\n <yuv-string [autofocus]=\"true\" [required]=\"true\" formControlName=\"templateName\"> </yuv-string>\n </yuv-form-input>\n @for (e of formErrors; track $index) {\n <div class=\"errors\">{{ e }}</div>\n }\n <yuv-sequence-list disable-duedate=\"true\" formControlName=\"sequence\"> </yuv-sequence-list>\n </form>\n}\n\n<div class=\"buttons\">\n <div class=\"left\">\n <button type=\"button\" class=\"secondary\" (click)=\"cancel.emit()\">{{ 'yuv.sequence-list.template.cancel' | translate }}</button>\n </div>\n\n @if (selectedTemplate) {\n <div class=\"right\">\n @if (selectedTemplate.id !== CURRENT_ENTRIES_ID) {\n <button class=\"secondary delete\" type=\"button\" (click)=\"deleteTemplate()\">\n {{ 'yuv.sequence-list.template.button.delete' | translate }}\n </button>\n\n <button class=\"primary apply\" type=\"button\" [disabled]=\"disableSubmit || form.invalid || form.dirty\" (click)=\"applyTemplate()\">\n {{ 'yuv.sequence-list.template.button.apply' | translate }}\n </button>\n }\n\n <!-- save -->\n <button\n class=\"{{ selectedTemplate.id !== CURRENT_ENTRIES_ID ? 'primary' : 'primary' }} save\"\n (click)=\"submit()\"\n type=\"button\"\n [disabled]=\"disableSubmit || form.invalid || form.pristine\"\n >\n {{ selectedTemplate.id !== CURRENT_ENTRIES_ID ? labels.save : labels.saveNew }}\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:grid;height:100%;grid-template-rows:1fr auto;grid-template-columns:200px 1fr;grid-template-areas:\"list template\" \"buttons buttons\"}:host header{font-weight:700;padding:var(--app-pane-padding);border-bottom:1px solid var(--panel-divider-color)}:host .template-list{grid-area:list;display:grid;height:100%;grid-template-rows:auto auto auto 1fr;grid-template-columns:1fr;grid-template-areas:\"header\" \"current\" \"filter\" \"templates\";border-right:1px solid var(--panel-divider-color);overflow:hidden}:host .template-list header{grid-area:header}:host .template-list .filter{grid-area:filter;padding:var(--app-pane-padding);border:1px solid var(--panel-divider-color);border-width:1px 0;background-color:var(--panel-background-lightgrey)}:host .template-list .currententries{grid-area:current}:host .template-list .templates{grid-area:templates;overflow-y:auto}:host .template-list .item{padding:var(--app-pane-padding);cursor:pointer}:host .template-list .item:not(.currententries){border-bottom:1px solid var(--panel-divider-color)}:host .template-list .item:not(.current):hover{background-color:var(--item-focus-background-color)}:host .template-list .item.current{background-color:var(--item-selected-background-color)}:host .template{grid-area:template;display:grid;height:100%;overflow-y:auto;grid-template-rows:auto auto auto 1fr;grid-template-columns:1fr;grid-template-areas:\"headline\" \"name\" \"errors\" \"sequence\"}:host .template h2{grid-area:headline}:host .template yuv-form-input{grid-area:name;margin:var(--app-pane-padding);margin-bottom:calc(var(--app-pane-padding) / 2)}:host .template .errors{grid-area:errors;margin:0 var(--app-pane-padding);color:var(--color-error)}:host .template yuv-sequence-list{grid-area:sequence;margin:var(--app-pane-padding);box-shadow:0 0 1.2em #0000001a}:host .buttons{grid-area:buttons;overflow-x:auto;display:flex;padding:calc(var(--app-pane-padding) / 2) calc(var(--app-pane-padding) / 2 - 2px);border-top:1px solid var(--panel-divider-color)}:host .buttons .left{display:flex}:host .buttons .right{flex:1;display:flex;justify-content:flex-end}:host .buttons .right .save{order:2}:host .buttons .right .delete{order:1}:host .buttons .right .apply{order:3}:host .buttons button{margin:0 2px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: YvcOverlayModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }, { kind: "component", type: FormInputComponent, selector: "yuv-form-input", inputs: ["label", "tag", "description", "invalid", "disabled", "required"] }, { kind: "component", type: StringComponent, selector: "yuv-string", inputs: ["multiselect", "rows", "readonly", "autofocus", "classifications", "situation", "regex", "minLength", "maxLength"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2$2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SequenceListComponent, selector: "yuv-sequence-list", inputs: ["maxLength"] }, { kind: "ngmodule", type: YuvFormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: YvcCommonModule }, { kind: "pipe", type: i4.FilterPipe, name: "filter" }] }); }
393
- }
394
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SequenceListTemplateManageComponent, decorators: [{
395
- type: Component,
396
- args: [{ selector: 'yuv-sequence-list-template-manage', standalone: true, imports: [
397
- CommonModule,
398
- YvcOverlayModule,
399
- TranslateModule,
400
- FormInputComponent,
401
- StringComponent,
402
- FormsModule,
403
- CommonModule,
404
- SequenceListComponent,
405
- YuvFormsModule,
406
- ReactiveFormsModule,
407
- YvcCommonModule
408
- ], template: "<div class=\"template-list\">\n <header>{{ 'yuv.sequence-list.template-list.headline' | translate }}</header>\n\n <!-- current entries -->\n <div class=\"currententries item\" (click)=\"selectCurrentEntries()\" [ngClass]=\"{ current: selectedTemplate?.id === CURRENT_ENTRIES_ID }\">\n {{ 'yuv.sequence-list.template.headlineNew' | translate }}\n </div>\n\n <div class=\"filter\">\n <yuv-form-input [label]=\"'yuv.sequence-list.form.filter' | translate\">\n <yuv-string [(ngModel)]=\"filterTerm\"> </yuv-string>\n </yuv-form-input>\n </div>\n\n <div class=\"templates\">\n @for (tpl of templates | filter: filterTerm : 'name'; track $index) {\n <div class=\"item\" (click)=\"selectedTemplate = tpl\" [ngClass]=\"{ current: selectedTemplate?.id === tpl.id }\">\n {{ tpl.name }}\n </div>\n }\n </div>\n</div>\n\n@if (selectedTemplate) {\n <form class=\"template\" [formGroup]=\"form\">\n <header>{{ selectedTemplate.id !== CURRENT_ENTRIES_ID ? labels.headline : labels.headlineNew }}</header>\n\n <yuv-form-input [label]=\"'yuv.sequence-list.form.templateName' | translate\" [required]=\"true\" [invalid]=\"!!formErrors.length\">\n <yuv-string [autofocus]=\"true\" [required]=\"true\" formControlName=\"templateName\"> </yuv-string>\n </yuv-form-input>\n @for (e of formErrors; track $index) {\n <div class=\"errors\">{{ e }}</div>\n }\n <yuv-sequence-list disable-duedate=\"true\" formControlName=\"sequence\"> </yuv-sequence-list>\n </form>\n}\n\n<div class=\"buttons\">\n <div class=\"left\">\n <button type=\"button\" class=\"secondary\" (click)=\"cancel.emit()\">{{ 'yuv.sequence-list.template.cancel' | translate }}</button>\n </div>\n\n @if (selectedTemplate) {\n <div class=\"right\">\n @if (selectedTemplate.id !== CURRENT_ENTRIES_ID) {\n <button class=\"secondary delete\" type=\"button\" (click)=\"deleteTemplate()\">\n {{ 'yuv.sequence-list.template.button.delete' | translate }}\n </button>\n\n <button class=\"primary apply\" type=\"button\" [disabled]=\"disableSubmit || form.invalid || form.dirty\" (click)=\"applyTemplate()\">\n {{ 'yuv.sequence-list.template.button.apply' | translate }}\n </button>\n }\n\n <!-- save -->\n <button\n class=\"{{ selectedTemplate.id !== CURRENT_ENTRIES_ID ? 'primary' : 'primary' }} save\"\n (click)=\"submit()\"\n type=\"button\"\n [disabled]=\"disableSubmit || form.invalid || form.pristine\"\n >\n {{ selectedTemplate.id !== CURRENT_ENTRIES_ID ? labels.save : labels.saveNew }}\n </button>\n </div>\n }\n</div>\n", styles: [":host{display:grid;height:100%;grid-template-rows:1fr auto;grid-template-columns:200px 1fr;grid-template-areas:\"list template\" \"buttons buttons\"}:host header{font-weight:700;padding:var(--app-pane-padding);border-bottom:1px solid var(--panel-divider-color)}:host .template-list{grid-area:list;display:grid;height:100%;grid-template-rows:auto auto auto 1fr;grid-template-columns:1fr;grid-template-areas:\"header\" \"current\" \"filter\" \"templates\";border-right:1px solid var(--panel-divider-color);overflow:hidden}:host .template-list header{grid-area:header}:host .template-list .filter{grid-area:filter;padding:var(--app-pane-padding);border:1px solid var(--panel-divider-color);border-width:1px 0;background-color:var(--panel-background-lightgrey)}:host .template-list .currententries{grid-area:current}:host .template-list .templates{grid-area:templates;overflow-y:auto}:host .template-list .item{padding:var(--app-pane-padding);cursor:pointer}:host .template-list .item:not(.currententries){border-bottom:1px solid var(--panel-divider-color)}:host .template-list .item:not(.current):hover{background-color:var(--item-focus-background-color)}:host .template-list .item.current{background-color:var(--item-selected-background-color)}:host .template{grid-area:template;display:grid;height:100%;overflow-y:auto;grid-template-rows:auto auto auto 1fr;grid-template-columns:1fr;grid-template-areas:\"headline\" \"name\" \"errors\" \"sequence\"}:host .template h2{grid-area:headline}:host .template yuv-form-input{grid-area:name;margin:var(--app-pane-padding);margin-bottom:calc(var(--app-pane-padding) / 2)}:host .template .errors{grid-area:errors;margin:0 var(--app-pane-padding);color:var(--color-error)}:host .template yuv-sequence-list{grid-area:sequence;margin:var(--app-pane-padding);box-shadow:0 0 1.2em #0000001a}:host .buttons{grid-area:buttons;overflow-x:auto;display:flex;padding:calc(var(--app-pane-padding) / 2) calc(var(--app-pane-padding) / 2 - 2px);border-top:1px solid var(--panel-divider-color)}:host .buttons .left{display:flex}:host .buttons .right{flex:1;display:flex;justify-content:flex-end}:host .buttons .right .save{order:2}:host .buttons .right .delete{order:1}:host .buttons .right .apply{order:3}:host .buttons button{margin:0 2px}\n"] }]
409
- }], ctorParameters: () => [] });
410
-
411
- /**
412
- * Task sequence list including templates for sequence lists.
413
- * Templates are preconfigured lists of tasks and recipients.
414
- */
415
- class SequenceListTemplatesComponent {
416
- get entries() {
417
- return this._entries;
418
- }
419
- constructor() {
420
- this.fb = inject(FormBuilder);
421
- this.pendingChanges = inject(PendingChangesService);
422
- this.overlay = inject(YvcOverlayService);
423
- this.tplTemplateManager = viewChild('tplTemplateManager');
424
- this.form = this.fb.group({
425
- sequence: [[]]
426
- });
427
- this._entries = [];
428
- this.title = input();
429
- this.maxLength = input(100);
430
- this.templateStorageSection = input.required();
431
- this.itemEdit = output();
432
- // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars
433
- this.propagateChange = (_) => { };
434
- this.form.valueChanges.pipe(takeUntilDestroyed()).subscribe((res) => {
435
- this.setEntries(res.sequence, false);
436
- this.propagate();
437
- });
438
- }
439
- setEntries(e, patch) {
440
- this._entries = e;
441
- if (patch)
442
- this.form.patchValue({
443
- sequence: e || []
444
- });
445
- }
446
- propagate() {
447
- this.propagateChange(this.entries);
448
- }
449
- writeValue(value) {
450
- this.setEntries(value || [], true);
451
- }
452
- registerOnChange(fn) {
453
- this.propagateChange = fn;
454
- }
455
- // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars
456
- registerOnTouched(fn) { }
457
- // TEMPLATES
458
- openTemplateManager() {
459
- this.oRef = this.overlay.open(this.tplTemplateManager(), {
460
- width: '55%',
461
- height: '70%'
462
- });
463
- this.oRef.preventClose = () => this.pendingChanges.check();
464
- }
465
- templateManagerCancel() {
466
- if (this.oRef)
467
- this.oRef.close();
468
- }
469
- templateManagerSelect(entries) {
470
- this.setEntries(entries, true);
471
- if (this.oRef)
472
- this.oRef.close();
473
- }
474
- validate() {
475
- return this.form.invalid
476
- ? {
477
- sequencelist: { invalid: true }
478
- }
479
- : null;
480
- }
481
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SequenceListTemplatesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
482
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SequenceListTemplatesComponent, isStandalone: true, selector: "yuv-sequence-list-templates", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, templateStorageSection: { classPropertyName: "templateStorageSection", publicName: "templateStorageSection", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { itemEdit: "itemEdit" }, host: { attributes: { "tabindex": "0" } }, providers: [
483
- {
484
- provide: NG_VALUE_ACCESSOR,
485
- useExisting: forwardRef(() => SequenceListTemplatesComponent),
486
- multi: true
487
- },
488
- {
489
- provide: NG_VALIDATORS,
490
- useExisting: forwardRef(() => SequenceListTemplatesComponent),
491
- multi: true
492
- }
493
- ], viewQueries: [{ propertyName: "tplTemplateManager", first: true, predicate: ["tplTemplateManager"], descendants: true, isSignal: true }], ngImport: i0, template: "<form [formGroup]=\"form\">\n <yuv-sequence-list formControlName=\"sequence\" [maxLength]=\"maxLength()\">\n \n @if (!!templateStorageSection) {\n <button class=\"btn-templates secondary\" (click)=\"openTemplateManager()\">{{ 'yuv.sequence-list.button.templates' | translate }}</button>\n }\n </yuv-sequence-list>\n</form>\n\n<!-- template manager overlay -->\n<ng-template #tplTemplateManager>\n <yuv-sequence-list-template-manage\n (cancel)=\"oRef?.close()\"\n (templateSelect)=\"templateManagerSelect($event)\"\n [storageSection]=\"templateStorageSection() \"\n [currentEntries]=\"entries\"\n >\n </yuv-sequence-list-template-manage>\n</ng-template>\n", styles: [":host{display:block;overflow-y:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: SequenceListComponent, selector: "yuv-sequence-list", inputs: ["maxLength"] }, { kind: "component", type: SequenceListTemplateManageComponent, selector: "yuv-sequence-list-template-manage", inputs: ["storageSection", "currentEntries"], outputs: ["templateSelect", "cancel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] }); }
494
- }
495
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SequenceListTemplatesComponent, decorators: [{
496
- type: Component,
497
- args: [{ selector: 'yuv-sequence-list-templates', standalone: true, imports: [CommonModule, FormsModule, ReactiveFormsModule,
498
- SequenceListComponent, SequenceListTemplateManageComponent, TranslateModule], providers: [
499
- {
500
- provide: NG_VALUE_ACCESSOR,
501
- useExisting: forwardRef(() => SequenceListTemplatesComponent),
502
- multi: true
503
- },
504
- {
505
- provide: NG_VALIDATORS,
506
- useExisting: forwardRef(() => SequenceListTemplatesComponent),
507
- multi: true
508
- }
509
- ], host: {
510
- tabindex: '0'
511
- }, template: "<form [formGroup]=\"form\">\n <yuv-sequence-list formControlName=\"sequence\" [maxLength]=\"maxLength()\">\n \n @if (!!templateStorageSection) {\n <button class=\"btn-templates secondary\" (click)=\"openTemplateManager()\">{{ 'yuv.sequence-list.button.templates' | translate }}</button>\n }\n </yuv-sequence-list>\n</form>\n\n<!-- template manager overlay -->\n<ng-template #tplTemplateManager>\n <yuv-sequence-list-template-manage\n (cancel)=\"oRef?.close()\"\n (templateSelect)=\"templateManagerSelect($event)\"\n [storageSection]=\"templateStorageSection() \"\n [currentEntries]=\"entries\"\n >\n </yuv-sequence-list-template-manage>\n</ng-template>\n", styles: [":host{display:block;overflow-y:auto}\n"] }]
512
- }], ctorParameters: () => [] });
513
-
514
235
  /**
515
236
  * Generated bundle index. Do not edit.
516
237
  */
517
238
 
518
- export { DueDatePickerComponent, SequenceListComponent, SequenceListTemplateManageComponent, SequenceListTemplatesComponent };
239
+ export { DueDatePickerComponent, SequenceListComponent };
519
240
  //# sourceMappingURL=yuuvis-client-framework-sequence-list.mjs.map