@yuuvis/client-framework 3.20.0 → 3.21.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.
@@ -24,7 +24,7 @@
24
24
  "yuv.action-menu.action.unlock.description-locked-by-other": "Das Objekt ist von {{ user }} gesperrt.",
25
25
  "yuv.action-menu.action.unlock.description-locked-by-unknown-user": " Das Objekt ist von einem Benutzer gesperrt.",
26
26
  "yuv.badge.empty.selection": "Derzeit gibt es keine Badges zur Auswahl.",
27
- "yuv.badge.lock.description": "Dieses Objekt ist gegen Änderungen gesperrt.",
27
+ "yuv.badge.lock.description": "Dieses Objekt ist von {{ user }} gesperrt.",
28
28
  "yuv.badge.lock.label": "Gesperrt",
29
29
  "yuv.badge.lock.self.description": "Dieses Objekt ist von Ihnen gesperrt.",
30
30
  "yuv.badge.lock.self.label": "Von Ihnen gesperrt",
@@ -24,7 +24,7 @@
24
24
  "yuv.action-menu.action.unlock.description-locked-by-other": "The object is locked by {{ user }}.",
25
25
  "yuv.action-menu.action.unlock.description-locked-by-unknown-user": " The object is locked by a user.",
26
26
  "yuv.badge.empty.selection": "No badges currently available for selection.",
27
- "yuv.badge.lock.description": "This object is locked and cannot be modified.",
27
+ "yuv.badge.lock.description": "This object is locked by {{ user }}.",
28
28
  "yuv.badge.lock.label": "Locked",
29
29
  "yuv.badge.lock.self.description": "This object is locked by you.",
30
30
  "yuv.badge.lock.self.label": "Locked by you",
@@ -53,7 +53,7 @@
53
53
  "yuv.form.element.datetime.calendar.today": "Today",
54
54
  "yuv.form.element.organization-set.classify.icon.title": "Group",
55
55
  "yuv.form.element.organization.classify.icon.title": "User",
56
- "yuv.form.element.organization.freetext.tooltip": "Free text – not a resolved user or group",
56
+ "yuv.form.element.organization.freetext.tooltip": "Free text – no resolved user or group",
57
57
  "yuv.form.element.range-select-date.custom.overlay.button.apply": "Apply",
58
58
  "yuv.form.element.range-select-date.custom.overlay.title": "User-defined time period",
59
59
  "yuv.form.element.range-select-date.option.any": "Any date",
@@ -92,7 +92,7 @@
92
92
  "yuv.object-metadata.tabs.indexdata.title": "Metadata",
93
93
  "yuv.object-flavor.apply-flavor.button.apply": "Apply",
94
94
  "yuv.object-flavor.apply-flavor.button.cancel": "Cancel",
95
- "yuv.object-flavor.apply-flavor.error": "The type could not be added.",
95
+ "yuv.object-flavor.apply-flavor.error": "Unable to add type.",
96
96
  "yuv.object-flavor.apply-flavor.headline": "Add type '{{name}}'",
97
97
  "yuv.object-flavor.button.add": "Add type",
98
98
  "yuv.object-flavor.button.clear-selection": "Unselect",
@@ -195,7 +195,7 @@
195
195
  "yuv.smart-search.fulltext.types.all": "All types",
196
196
  "yuv.smart-search.fulltext.types.label": "Limit to types",
197
197
  "yuv.smart-search.mode.empty": "No input fields available. Mark conditions with the lightning icon to add them here.",
198
- "yuv.smart-search.mode.essentials": "Essentials",
198
+ "yuv.smart-search.mode.essentials": "Compact",
199
199
  "yuv.smart-search.mode.full": "Full search",
200
200
  "yuv.smart-search.mode.label": "Search mode",
201
201
  "yuv.smart-search.operator.change": "Modify operator",
@@ -217,7 +217,7 @@
217
217
  "yuv.tile-config.button.close": "Close",
218
218
  "yuv.tile-config.button.reset": "Reset",
219
219
  "yuv.tile-config.button.save": "Save changes",
220
- "yuv.tile-config.error.title-required": "A title attribute is required. Select an attribute for the title slot.",
220
+ "yuv.tile-config.error.title-required": "A title attribute is required. Select an attribute for the title.",
221
221
  "yuv.tile-config.icon-select.pick": "Select icon",
222
222
  "yuv.tile-config.icon-select.reset": "Reset",
223
223
  "yuv.tile-config.slot.action.headline": "Actions",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuuvis/client-framework",
3
- "version": "3.20.0",
3
+ "version": "3.21.0",
4
4
  "author": "OPTIMAL SYSTEMS GmbH <npm@optimal-systems.de>",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
@@ -8,17 +8,17 @@
8
8
  "@angular/common": "^21.2.19",
9
9
  "@angular/core": "^21.2.19",
10
10
  "angular-gridster2": "^21.0.1",
11
- "@yuuvis/client-core": "^3.20.0",
12
- "@yuuvis/client-shell-core": "^3.20.0",
13
- "@yuuvis/client-components": "^3.20.0",
11
+ "@yuuvis/client-core": "^3.21.0",
12
+ "@yuuvis/client-shell-core": "^3.21.0",
13
+ "@yuuvis/client-components": "^3.21.0",
14
14
  "ng-dynamic-component": "^10.8.2",
15
15
  "modern-normalize": "^3.0.1"
16
16
  },
17
17
  "dependencies": {
18
18
  "@angular/material": "^21.2.14",
19
19
  "@ngrx/signals": "^21.1.0",
20
- "@yuuvis/material": "^3.20.0",
21
- "@yuuvis/media-viewer": "^4.0.0",
20
+ "@yuuvis/material": "^3.21.0",
21
+ "@yuuvis/media-viewer": "^4.1.0",
22
22
  "angular-split": "^20.0.0",
23
23
  "vis-network": "^10.0.2",
24
24
  "tslib": "^2.3.0"
@@ -1,6 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { Signal } from '@angular/core';
3
3
  import { DmsObject, YuvUser, LockState, VirtualObjectType } from '@yuuvis/client-core';
4
+ import { Observable } from 'rxjs';
4
5
  import { Severity } from '@yuuvis/material/badge';
5
6
 
6
7
  type BadgeSeverity = Severity;
@@ -8,7 +9,14 @@ type BadgeSeverity = Severity;
8
9
  interface BadgeContext {
9
10
  currentUser?: YuvUser;
10
11
  lockState?: LockState;
12
+ /**
13
+ * Resolves a user id to a user (cached IDM lookup). Emits `null` when the
14
+ * user is unknown or the lookup fails.
15
+ */
16
+ resolveUser: (userId: string) => Observable<YuvUser | null>;
11
17
  }
18
+ /** Interpolation params for a translated badge description (`{{ placeholder }}` syntax). */
19
+ type BadgeDescriptionParams = Record<string, unknown>;
12
20
  interface BadgeRule {
13
21
  field: string;
14
22
  op: 'isSet' | 'equals' | 'tagPresent';
@@ -35,6 +43,13 @@ interface Badge {
35
43
  id: string;
36
44
  labelKey: string;
37
45
  descriptionKey?: string;
46
+ /**
47
+ * Optional interpolation params for `descriptionKey`. May resolve asynchronously
48
+ * (e.g. a user name looked up from an id). Only evaluated by `yuv-badge-chip`
49
+ * when a `dmsObject` is bound; until the params resolve, the description is
50
+ * rendered without them.
51
+ */
52
+ descriptionParams?: (dmsObject: DmsObject, ctx: BadgeContext) => Observable<BadgeDescriptionParams> | BadgeDescriptionParams;
38
53
  icon: string;
39
54
  svgIcon?: boolean;
40
55
  severity?: BadgeSeverity;
@@ -60,6 +75,16 @@ declare class BadgeChipComponent {
60
75
  #private;
61
76
  badge: _angular_core.InputSignal<Badge>;
62
77
  showLabel: _angular_core.InputSignal<boolean>;
78
+ /**
79
+ * The object the badge is shown for. Required to resolve {@link Badge.descriptionParams}
80
+ * (e.g. the name of the user holding a lock); without it the description renders as-is.
81
+ */
82
+ dmsObject: _angular_core.InputSignal<DmsObject | undefined>;
83
+ /**
84
+ * Translated tooltip. Uses `descriptionKey` (interpolated with the badge's resolved
85
+ * `descriptionParams`) and falls back to `labelKey` when no description is available.
86
+ * While async params are pending, the description is shown without them.
87
+ */
63
88
  readonly tooltip: _angular_core.Signal<string>;
64
89
  /**
65
90
  * Accessible name for the icon-only variant. Without a label the chip renders nothing
@@ -69,7 +94,7 @@ declare class BadgeChipComponent {
69
94
  */
70
95
  readonly ariaLabel: _angular_core.Signal<string | null>;
71
96
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BadgeChipComponent, never>;
72
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<BadgeChipComponent, "yuv-badge-chip", never, { "badge": { "alias": "badge"; "required": true; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
97
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BadgeChipComponent, "yuv-badge-chip", never, { "badge": { "alias": "badge"; "required": true; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "dmsObject": { "alias": "dmsObject"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
73
98
  }
74
99
 
75
100
  declare class BadgeSelectComponent {
@@ -201,6 +226,11 @@ declare class BadgeRegistryService {
201
226
  bucket?: string;
202
227
  idFilter?: string[];
203
228
  }): Badge[];
229
+ /**
230
+ * Builds the evaluation context for a badge against the given object. Used both
231
+ * for `applies` evaluation and for resolving {@link Badge.descriptionParams}.
232
+ */
233
+ createContext(dmsObject: DmsObject): BadgeContext;
204
234
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<BadgeRegistryService, never>;
205
235
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<BadgeRegistryService>;
206
236
  }
@@ -245,4 +275,4 @@ declare function evaluateRule(rule: BadgeRule, dmsObject: DmsObject): boolean;
245
275
  declare function badgeSupportsType(badge: Badge, objectType?: VirtualObjectType): boolean;
246
276
 
247
277
  export { BadgeChipComponent, BadgeRegistryService, BadgeSelectComponent, LOCK_BADGE, LOCK_SELF_BADGE, RETENTION_BADGE, TileBadgesComponent, badgeSupportsType, evaluateRule };
248
- export type { Badge, BadgeContext, BadgeRule, BadgeSeverity, BadgeSupport };
278
+ export type { Badge, BadgeContext, BadgeDescriptionParams, BadgeRule, BadgeSeverity, BadgeSupport };
@@ -172,6 +172,7 @@ declare class DateInputComponent implements OnInit, OnDestroy {
172
172
  set disabled(d: boolean);
173
173
  private _disabled;
174
174
  invalid: _angular_core.WritableSignal<boolean>;
175
+ private _dateInvalid;
175
176
  private _refreshPlaceholder;
176
177
  _placeholder?: string;
177
178
  set placeholder(p: string);
@@ -189,9 +190,23 @@ declare class DateInputComponent implements OnInit, OnDestroy {
189
190
  dayPeriodLabels: DayPeriodLabels;
190
191
  constructor(datepickerService: DatepickerService, fb: FormBuilder, elRef: ElementRef);
191
192
  private _setupForm;
192
- private _setInvalidInputError;
193
+ /**
194
+ * Reflects both sources of invalidity: a structurally incomplete/invalid form
195
+ * (missing or out of range parts) and input that does not describe a real
196
+ * calendar date (e.g. 31st of February). Both have to be taken into account
197
+ * here because the form group may well be VALID while the entered parts still
198
+ * do not add up to an existing date.
199
+ */
200
+ private _updateInvalidState;
193
201
  private _checkAndPropagateForm;
194
202
  private _formToDate;
203
+ private _formToTime;
204
+ /**
205
+ * Strict integer parse - unlike parseInt it rejects values with trailing
206
+ * garbage ('1x') so those cannot slip through as a valid date part.
207
+ */
208
+ private _toInt;
209
+ private _daysInMonth;
195
210
  private _focusInput;
196
211
  onFormClick(event: MouseEvent): void;
197
212
  onDateInputBlur(): void;
@@ -165,6 +165,12 @@ declare class SmartSearchEditController {
165
165
  * searchable type of the schema is a candidate and nothing is restricted.
166
166
  */
167
167
  allowedTypes: _angular_core.WritableSignal<string[]>;
168
+ /**
169
+ * Whether to bypass the user's object-type read permissions when offering types
170
+ * (mirrors the host `ignoreTypePermissions` input). Off by default: only types the
171
+ * user may search are offered.
172
+ */
173
+ ignoreTypePermissions: _angular_core.WritableSignal<boolean>;
168
174
  /** ObjectTypeField IDs to exclude from the field-step autocomplete suggestions. */
169
175
  skipProperties: _angular_core.WritableSignal<string[]>;
170
176
  fieldCtrl: FormControl<string | null>;
@@ -516,6 +522,15 @@ declare class SmartSearchComponent {
516
522
  * is offered in the picker, so only a full-text search can be built.
517
523
  */
518
524
  types: _angular_core.InputSignal<string[]>;
525
+ /**
526
+ * Offers every object type of the schema in the type picker, not only those the user
527
+ * has READ permission for. Off by default.
528
+ *
529
+ * Meant for surfaces that *author* a query rather than execute it as the current user
530
+ * (admin/configuration screens, stored-search templates). {@link types} still applies
531
+ * on top: this widens what the permissions allow, never what the consumer scoped.
532
+ */
533
+ ignoreTypePermissions: _angular_core.InputSignal<boolean>;
519
534
  /**
520
535
  * Field ids to hide from the field-step autocomplete (e.g. internal/system
521
536
  * properties that should not be user-queryable). Applies to block fields and
@@ -788,7 +803,7 @@ declare class SmartSearchComponent {
788
803
  */
789
804
  getObjectTypeField(item: SuggestionItem | null): ObjectTypeField | null;
790
805
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SmartSearchComponent, never>;
791
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SmartSearchComponent, "yuv-smart-search", never, { "types": { "alias": "types"; "required": false; "isSignal": true; }; "skipProperties": { "alias": "skipProperties"; "required": false; "isSignal": true; }; "fulltextOnly": { "alias": "fulltextOnly"; "required": false; "isSignal": true; }; "supportDynamicConditions": { "alias": "supportDynamicConditions"; "required": false; "isSignal": true; }; }, { "queryChange": "queryChange"; "querySubmit": "querySubmit"; }, never, never, true, never>;
806
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SmartSearchComponent, "yuv-smart-search", never, { "types": { "alias": "types"; "required": false; "isSignal": true; }; "ignoreTypePermissions": { "alias": "ignoreTypePermissions"; "required": false; "isSignal": true; }; "skipProperties": { "alias": "skipProperties"; "required": false; "isSignal": true; }; "fulltextOnly": { "alias": "fulltextOnly"; "required": false; "isSignal": true; }; "supportDynamicConditions": { "alias": "supportDynamicConditions"; "required": false; "isSignal": true; }; }, { "queryChange": "queryChange"; "querySubmit": "querySubmit"; }, never, never, true, never>;
792
807
  }
793
808
 
794
809
  declare class YuvSmartSearchModule {