@yuuvis/client-framework 2.10.3 → 2.11.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 (60) hide show
  1. package/autocomplete/lib/autocomplete.component.d.ts +4 -4
  2. package/autocomplete/lib/autocomplete.interface.d.ts +2 -2
  3. package/common/lib/services/index.d.ts +1 -0
  4. package/common/lib/services/layout-settings/layout-settings.service.d.ts +15 -0
  5. package/common/lib/services/theme/index.d.ts +3 -0
  6. package/common/lib/services/theme/theme.models.d.ts +16 -0
  7. package/common/lib/services/theme/theme.provider.d.ts +4 -0
  8. package/common/lib/services/theme/theme.service.d.ts +16 -0
  9. package/fesm2022/yuuvis-client-framework-common.mjs +213 -4
  10. package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -1
  11. package/fesm2022/yuuvis-client-framework-datepicker.mjs +1 -1
  12. package/fesm2022/yuuvis-client-framework-datepicker.mjs.map +1 -1
  13. package/fesm2022/yuuvis-client-framework-forms.mjs +46 -21
  14. package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
  15. package/fesm2022/yuuvis-client-framework-object-flavor.mjs +2 -2
  16. package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -1
  17. package/fesm2022/yuuvis-client-framework-object-relationship.mjs +135 -52
  18. package/fesm2022/yuuvis-client-framework-object-relationship.mjs.map +1 -1
  19. package/fesm2022/yuuvis-client-framework-object-versions.mjs +4 -3
  20. package/fesm2022/yuuvis-client-framework-object-versions.mjs.map +1 -1
  21. package/fesm2022/yuuvis-client-framework-query-list.mjs +5 -4
  22. package/fesm2022/yuuvis-client-framework-query-list.mjs.map +1 -1
  23. package/fesm2022/yuuvis-client-framework-tile-list.mjs +20 -4
  24. package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
  25. package/fesm2022/yuuvis-client-framework.mjs +616 -98
  26. package/fesm2022/yuuvis-client-framework.mjs.map +1 -1
  27. package/forms/lib/elements/datetime/datetime.component.d.ts +0 -1
  28. package/forms/lib/elements/organization/organization.component.d.ts +1 -1
  29. package/forms/lib/elements/organization-set/organization-set.component.d.ts +1 -1
  30. package/index.d.ts +5 -2
  31. package/lib/config/index.d.ts +1 -0
  32. package/lib/config/session/index.d.ts +3 -0
  33. package/lib/config/session/session-activity-window-before-end.const.d.ts +43 -0
  34. package/lib/config/session/session-default-duration.const.d.ts +47 -0
  35. package/lib/config/session/session-popup-before-end.const.d.ts +47 -0
  36. package/lib/enums/channel-message.enum.d.ts +4 -0
  37. package/lib/enums/index.d.ts +1 -0
  38. package/lib/models/index.d.ts +2 -0
  39. package/lib/models/session/channel-payload.model.d.ts +5 -0
  40. package/lib/models/session/index.d.ts +1 -0
  41. package/lib/models/snack-bar/index.d.ts +3 -0
  42. package/lib/models/snack-bar/snack-bar-data.model.d.ts +6 -0
  43. package/lib/models/snack-bar/snack-bar-level.model.d.ts +1 -0
  44. package/lib/{services/snack-bar/snack-bar.interface.d.ts → models/snack-bar/snack-bar-options.model.d.ts} +1 -6
  45. package/lib/providers/index.d.ts +1 -0
  46. package/lib/providers/session/index.d.ts +1 -0
  47. package/lib/providers/session/provide-session.provider.d.ts +43 -0
  48. package/lib/services/index.d.ts +2 -2
  49. package/lib/services/session/session.service.d.ts +113 -0
  50. package/lib/services/snack-bar/snack-bar.service.d.ts +5 -5
  51. package/object-relationship/index.d.ts +1 -0
  52. package/object-relationship/lib/actions/add-relationship/add-relationship.component.d.ts +10 -0
  53. package/object-relationship/lib/actions/relationship-target-search/relationship-target-search.component.d.ts +17 -4
  54. package/object-relationship/lib/object-relationship.const.d.ts +0 -1
  55. package/object-versions/lib/object-versions.component.d.ts +1 -0
  56. package/package.json +8 -8
  57. package/query-list/lib/query-list.component.d.ts +8 -7
  58. package/tile-list/lib/tile-list/tile-list.component.d.ts +4 -2
  59. package/lib/assets/i18n/de.json +0 -202
  60. package/lib/assets/i18n/en.json +0 -202
@@ -0,0 +1,43 @@
1
+ import { EnvironmentProviders } from '@angular/core';
2
+ /**
3
+ * Provides and initializes the SessionService at application startup.
4
+ *
5
+ * What it does
6
+ * - Registers SessionService as a singleton to manage session expiry across the app
7
+ * - Runs `session.init()` via APP_INITIALIZER when the app boots
8
+ * - Initializes cross-tab BroadcastChannel sync, HTTP debounce hooks, and user-activity listeners
9
+ * - Automatically tracks HTTP activity and user interactions to extend sessions
10
+ *
11
+ * Usage scenarios
12
+ *
13
+ * Scenario 1: Known session duration at startup
14
+ * When the session duration is predetermined and constant, provide it here.
15
+ * ```ts
16
+ * // app.config.ts
17
+ * export const appConfig: ApplicationConfig = {
18
+ * providers: [
19
+ * provideSession(30 * 60 * 1000), // 30 minutes
20
+ * ]
21
+ * };
22
+ * ```
23
+ *
24
+ * Scenario 2: Dynamic session duration from backend
25
+ * When the session duration is determined after login (e.g., from backend response),
26
+ * omit the parameter here and call `startSession()` after receiving the duration.
27
+ * ```ts
28
+ * // app.config.ts
29
+ * export const appConfig: ApplicationConfig = {
30
+ * providers: [
31
+ * provideSession(), // Defaults to 30 minutes until startSession() is called
32
+ * ]
33
+ * };
34
+ *
35
+ * // After login in AuthService:
36
+ * login().subscribe(response => {
37
+ * sessionService.startSession(response.sessionExpiresIn); // Set actual duration
38
+ * });
39
+ * ```
40
+ *
41
+ * @param sessionDuration Optional session duration in milliseconds. If omitted, defaults to 30 minutes (1800000ms).
42
+ */
43
+ export declare function provideSession(sessionDuration?: number): EnvironmentProviders;
@@ -1,4 +1,4 @@
1
1
  export * from './halo-focus/halo-focus.service';
2
- export * from './snack-bar/snack-bar.interface';
3
- export * from './snack-bar/snack-bar.service';
4
2
  export * from './halo-utility/halo-utility.service';
3
+ export * from './session/session.service';
4
+ export * from './snack-bar/snack-bar.service';
@@ -0,0 +1,113 @@
1
+ import * as i0 from "@angular/core";
2
+ /**
3
+ * Manages client-side session expiry: persists expiration, tracks user and HTTP activity,
4
+ * shows a pre-expiry popup with an extend CTA, and syncs state across tabs via BroadcastChannel.
5
+ *
6
+ * Key behaviors
7
+ * - Persists `expiresAt` in AppCacheService so multiple tabs share the same deadline
8
+ * - Automatically listens to BackendService HTTP activity (debounced) to extend sessions
9
+ * - Extends backend session by calling `/api-web/api/idm/whoami` endpoint (skipped when triggered by HTTP activity)
10
+ * - User activity (mouse, keyboard, scroll) inside a defined window will auto-extend the session
11
+ * - Displays a snack popup shortly before expiry; user can extend from the popup
12
+ * - Broadcasts `SessionExtended` / `SessionLogout` to keep tabs in sync
13
+ *
14
+ * Setup options
15
+ *
16
+ * Option 1: Known session duration at startup
17
+ * Use when the session duration is known in advance and remains constant.
18
+ * ```ts
19
+ * // app.config.ts
20
+ * export const appConfig: ApplicationConfig = {
21
+ * providers: [
22
+ * provideSession(30 * 60 * 1000), // 30 minutes - set at app startup
23
+ * ]
24
+ * };
25
+ * ```
26
+ *
27
+ * Option 2: Dynamic session duration from backend
28
+ * Use when the session duration is determined after login (e.g., from backend response).
29
+ * ```ts
30
+ * // app.config.ts
31
+ * export const appConfig: ApplicationConfig = {
32
+ * providers: [
33
+ * provideSession(), // Initialize without duration (defaults to 30 minutes)
34
+ * ]
35
+ * };
36
+ *
37
+ * // After login in AuthService:
38
+ * login().subscribe(response => {
39
+ * const sessionDuration = response.sessionExpiresIn; // from backend
40
+ * sessionService.startSession(sessionDuration);
41
+ * });
42
+ * ```
43
+ * Note: If no duration is provided to provideSession(), a default of 30 minutes is used until startSession() is called.
44
+ *
45
+ * Lifecycle notes
46
+ * - HTTP activity is automatically tracked via BackendService.httpCommunicationOccurred$
47
+ * - Backend session is extended via whoami endpoint, except when triggered by HTTP activity or cross-tab sync
48
+ * - Internal flag prevents recursive whoami calls when the endpoint itself triggers httpCommunicationOccurred$
49
+ * - Warning and logout timers are reset on every extend
50
+ * - All timers and the popup are cleared on logout
51
+ * - Broadcast messages are listened for and mirrored across tabs
52
+ * - For UI activity, this service listens to DOM events (mousemove, keydown, click, scroll)
53
+ */
54
+ export declare class SessionService {
55
+ #private;
56
+ private translate;
57
+ /**
58
+ * Initializes cross-tab listeners and activity hooks.
59
+ *
60
+ * IMPORTANT: This is automatically called by `provideSession()` via APP_INITIALIZER.
61
+ * You should NOT call this manually - just add `provideSession()` to your app providers.
62
+ *
63
+ * What it does:
64
+ * - Initializes session with provided or default duration value
65
+ * - Wires BroadcastChannel subscriptions for cross-tab sync
66
+ * - Subscribes to BackendService.httpCommunicationOccurred$ for automatic HTTP activity tracking
67
+ * - Attaches DOM event listeners (mousemove, keydown, click, scroll) for the activity window
68
+ */
69
+ init(sessionDuration?: number): void;
70
+ /**
71
+ * Sets the session duration and starts the session lifecycle.
72
+ *
73
+ * Use this method when you need to set or update the session duration dynamically,
74
+ * typically after receiving authentication/session information from the backend.
75
+ *
76
+ * This is the correct approach when:
77
+ * - Session duration is not known at application startup
78
+ * - Duration comes from a backend API response after login
79
+ * - You need to manually override the duration set via provideSession()
80
+ *
81
+ * Example:
82
+ * ```ts
83
+ * // After login in AuthService
84
+ * login().subscribe(response => {
85
+ * this.sessionService.startSession(response.sessionExpiresIn);
86
+ * });
87
+ * ```
88
+ *
89
+ * @param duration Total session length in milliseconds
90
+ */
91
+ startSession(duration: number): void;
92
+ /**
93
+ * Extends the session expiry, resets all timers, and optionally broadcasts to other tabs.
94
+ *
95
+ * @param broadcast When true (default), posts a BroadcastChannel message so other tabs sync
96
+ * @param expiresAt Optional custom expiry timestamp; if not provided, calculates based on session duration
97
+ * @param skipBackendCall When true, skips the whoami backend call (used when already triggered by HTTP activity)
98
+ */
99
+ extendSession(broadcast?: boolean, expiresAt?: number, skipBackendCall?: boolean): void;
100
+ private listenToChannel;
101
+ private scheduleActivityWindow;
102
+ private showPopup;
103
+ private scheduleLogout;
104
+ private performLogout;
105
+ private setupHttpDebounce;
106
+ private setupUserActivityTracking;
107
+ private resetAllTimers;
108
+ private getExpiresAt;
109
+ private setExpiresAt;
110
+ private clearTimers;
111
+ static ɵfac: i0.ɵɵFactoryDeclaration<SessionService, never>;
112
+ static ɵprov: i0.ɵɵInjectableDeclaration<SessionService>;
113
+ }
@@ -1,12 +1,12 @@
1
1
  import { MatSnackBarRef } from '@angular/material/snack-bar';
2
- import { SnackBarLevel, SnackBarOptions } from './snack-bar.interface';
2
+ import { SnackBarLevel, SnackBarOptions } from '../../models';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class SnackBarService {
5
5
  #private;
6
- info(message: string, action?: string): MatSnackBarRef<SnackBarComponent>;
7
- success(message: string, action?: string): MatSnackBarRef<SnackBarComponent>;
8
- warning(message: string, action?: string): MatSnackBarRef<SnackBarComponent>;
9
- danger(message: string, action?: string): MatSnackBarRef<SnackBarComponent>;
6
+ info(message: string, action?: string, duration?: number): MatSnackBarRef<SnackBarComponent>;
7
+ success(message: string, action?: string, duration?: number): MatSnackBarRef<SnackBarComponent>;
8
+ warning(message: string, action?: string, duration?: number): MatSnackBarRef<SnackBarComponent>;
9
+ danger(message: string, action?: string, duration?: number): MatSnackBarRef<SnackBarComponent>;
10
10
  snack(message: string, options: SnackBarOptions): MatSnackBarRef<SnackBarComponent>;
11
11
  static ɵfac: i0.ɵɵFactoryDeclaration<SnackBarService, never>;
12
12
  static ɵprov: i0.ɵɵInjectableDeclaration<SnackBarService>;
@@ -1,4 +1,5 @@
1
1
  export * from './lib/object-relationship.module';
2
2
  export * from './lib/object-relationship.component';
3
+ export * from './lib/object-relationship.const';
3
4
  export * from './lib/object-relationship.interface';
4
5
  export * from './lib/actions/add-relationship/add-relationship.component';
@@ -5,13 +5,22 @@ import * as i0 from "@angular/core";
5
5
  export declare class AddRelationshipComponent {
6
6
  #private;
7
7
  readonly translate: TranslateService;
8
+ targetTypeLabels: Record<string, string>;
9
+ targetTypeFilterControl: FormControl<string[] | null>;
10
+ targetTypeFilterValue: import("@angular/core").Signal<string[] | null>;
8
11
  object: import("@angular/core").InputSignal<DmsObject>;
9
12
  config: import("@angular/core").InputSignal<RelationshipComponentConfig>;
10
13
  supportedRelationships: import("@angular/core").Signal<Relationship[]>;
14
+ filteredRelationships: import("@angular/core").Signal<Relationship[]>;
11
15
  availableTargetTypes: import("@angular/core").Signal<string[]>;
16
+ labeledTargetTypes: import("@angular/core").Signal<{
17
+ id: string;
18
+ label: string;
19
+ }[]>;
12
20
  sourceNode: import("@angular/core").Signal<{
13
21
  title: string;
14
22
  description: string | undefined;
23
+ icon: string | undefined;
15
24
  }>;
16
25
  form: FormGroup<{
17
26
  relation: FormControl<Relationship | null>;
@@ -20,6 +29,7 @@ export declare class AddRelationshipComponent {
20
29
  busy: import("@angular/core").WritableSignal<boolean>;
21
30
  error: import("@angular/core").WritableSignal<string | null>;
22
31
  optionCompareWith(o1: Relationship | undefined, o2: Relationship | undefined): boolean;
32
+ onRelationSelect(idx: number[]): void;
23
33
  submit(): void;
24
34
  close(): void;
25
35
  static ɵfac: i0.ɵɵFactoryDeclaration<AddRelationshipComponent, never>;
@@ -3,21 +3,34 @@ import { Relationship } from '@yuuvis/client-core';
3
3
  import { AutocompleteItem } from '@yuuvis/client-framework/autocomplete';
4
4
  import { RelationshipComponentConfig } from '../../object-relationship.interface';
5
5
  import * as i0 from "@angular/core";
6
+ interface AutocompleteItemValue {
7
+ description?: string;
8
+ data: Record<string, unknown>;
9
+ }
6
10
  export declare class RelationshipTargetSearchComponent implements ControlValueAccessor {
7
11
  #private;
8
12
  supportedRelationships: import("@angular/core").InputSignal<Relationship[]>;
9
- availableTargetTypes: import("@angular/core").InputSignal<string[]>;
13
+ sourceNode: import("@angular/core").InputSignal<string>;
14
+ targetTypes: import("@angular/core").InputSignal<string[]>;
10
15
  config: import("@angular/core").InputSignal<RelationshipComponentConfig>;
11
- autocompleteRes: AutocompleteItem[];
16
+ autocompleteRes: AutocompleteItem<AutocompleteItemValue>[];
17
+ innerValue: import("@angular/core").WritableSignal<AutocompleteItem<AutocompleteItemValue> | undefined>;
18
+ mappedValue: import("@angular/core").Signal<{
19
+ title: string;
20
+ description?: string;
21
+ icon?: string;
22
+ } | undefined>;
12
23
  busy: import("@angular/core").WritableSignal<boolean>;
13
- acFormControl: FormControl<AutocompleteItem[] | null>;
24
+ acFormControl: FormControl<AutocompleteItem<AutocompleteItemValue> | null>;
14
25
  constructor();
15
26
  autocompleteFn(term: string): void;
27
+ reset(): void;
16
28
  propagateChange: (_: any) => void;
17
29
  writeValue(value: any): void;
18
30
  registerOnChange(fn: any): void;
19
31
  registerOnTouched(fn: any): void;
20
32
  setDisabledState?(isDisabled: boolean): void;
21
33
  static ɵfac: i0.ɵɵFactoryDeclaration<RelationshipTargetSearchComponent, never>;
22
- static ɵcmp: i0.ɵɵComponentDeclaration<RelationshipTargetSearchComponent, "yuv-relationship-target-search", never, { "supportedRelationships": { "alias": "supportedRelationships"; "required": true; "isSignal": true; }; "availableTargetTypes": { "alias": "availableTargetTypes"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
34
+ static ɵcmp: i0.ɵɵComponentDeclaration<RelationshipTargetSearchComponent, "yuv-relationship-target-search", never, { "supportedRelationships": { "alias": "supportedRelationships"; "required": true; "isSignal": true; }; "sourceNode": { "alias": "sourceNode"; "required": true; "isSignal": true; }; "targetTypes": { "alias": "targetTypes"; "required": false; "isSignal": true; }; "config": { "alias": "config"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
23
35
  }
36
+ export {};
@@ -6,6 +6,5 @@ export declare const NODE_FONT_SETTINGS: Font;
6
6
  export declare const EDGE_SETTINGS: Partial<Edge>;
7
7
  export declare const EDGE_FONT_SETTINGS: Font;
8
8
  export declare const ADD_RELATIONSHIP_DIALOG_OPTIONS: {
9
- width: string;
10
9
  maxWidth: string;
11
10
  };
@@ -23,6 +23,7 @@ export declare class ObjectVersionsComponent {
23
23
  versions: import("@angular/core").WritableSignal<DmsObject[]>;
24
24
  selectedVersion: import("@angular/core").WritableSignal<DmsObject | undefined>;
25
25
  error: import("@angular/core").WritableSignal<string | undefined>;
26
+ selectedIndex: import("@angular/core").WritableSignal<number | null>;
26
27
  isCurrentVersion: import("@angular/core").Signal<boolean>;
27
28
  metadata: Partial<Metadata>;
28
29
  itemSelected(selectedIndex: number[]): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuuvis/client-framework",
3
- "version": "2.10.3",
3
+ "version": "2.11.0",
4
4
  "author": "OPTIMAL SYSTEMS GmbH <npm@optimal-systems.de>",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
@@ -8,15 +8,15 @@
8
8
  "@angular/common": "^19.2.1",
9
9
  "@angular/core": "^19.2.1",
10
10
  "angular-gridster2": "^19.0.0",
11
- "@yuuvis/client-core": "^2.10.3",
12
- "@yuuvis/client-shell-core": "^2.10.3",
11
+ "@yuuvis/client-core": "^2.11.0",
12
+ "@yuuvis/client-shell-core": "^2.11.0",
13
13
  "ng-dynamic-component": "^10.8.2",
14
14
  "modern-normalize": "^3.0.1"
15
15
  },
16
16
  "dependencies": {
17
17
  "@angular/material": "^19.2.15",
18
18
  "@ngrx/signals": "^19.2.0",
19
- "@yuuvis/material": "2.10.3",
19
+ "@yuuvis/material": "2.11.0",
20
20
  "@yuuvis/media-viewer": "^2.0.12",
21
21
  "angular-split": "^19.0.0",
22
22
  "vis-network": "^10.0.2",
@@ -68,14 +68,14 @@
68
68
  "types": "./list/index.d.ts",
69
69
  "default": "./fesm2022/yuuvis-client-framework-list.mjs"
70
70
  },
71
- "./metadata-form": {
72
- "types": "./metadata-form/index.d.ts",
73
- "default": "./fesm2022/yuuvis-client-framework-metadata-form.mjs"
74
- },
75
71
  "./master-details": {
76
72
  "types": "./master-details/index.d.ts",
77
73
  "default": "./fesm2022/yuuvis-client-framework-master-details.mjs"
78
74
  },
75
+ "./metadata-form": {
76
+ "types": "./metadata-form/index.d.ts",
77
+ "default": "./fesm2022/yuuvis-client-framework-metadata-form.mjs"
78
+ },
79
79
  "./metadata-form-defaults": {
80
80
  "types": "./metadata-form-defaults/index.d.ts",
81
81
  "default": "./fesm2022/yuuvis-client-framework-metadata-form-defaults.mjs"
@@ -48,7 +48,7 @@ import * as i0 from "@angular/core";
48
48
  * } *
49
49
  * ```
50
50
  */
51
- export declare class QueryListComponent {
51
+ export declare class QueryListComponent<T = any> {
52
52
  #private;
53
53
  list: import("@angular/core").Signal<ListComponent>;
54
54
  itemTemplate: import("@angular/core").Signal<TemplateRef<any> | undefined>;
@@ -66,7 +66,7 @@ export declare class QueryListComponent {
66
66
  /**
67
67
  * Optional transformer function to map SearchResultItem to a custom format.
68
68
  */
69
- transformer: import("@angular/core").InputSignal<((items: SearchResultItem[]) => unknown[]) | null | undefined>;
69
+ transformer: import("@angular/core").InputSignal<((items: SearchResultItem[]) => T[]) | null | undefined>;
70
70
  /**
71
71
  * Function that returns `true` if selection changes should be prevented.
72
72
  * This can be used to temporarily block selection changes, e.g. while
@@ -103,7 +103,7 @@ export declare class QueryListComponent {
103
103
  /**
104
104
  * The list of result items after applying the optional transformer.
105
105
  */
106
- resultItems: import("@angular/core").Signal<unknown[]>;
106
+ resultItems: import("@angular/core").Signal<T[]>;
107
107
  /**
108
108
  * Number of items to fetch per page when executing the query.
109
109
  * @default SearchService.DEFAULT_QUERY_SIZE
@@ -150,7 +150,7 @@ export declare class QueryListComponent {
150
150
  */
151
151
  updateListItems(updates: {
152
152
  index: number;
153
- value: unknown;
153
+ value: T;
154
154
  }[]): void;
155
155
  /**
156
156
  * Optional array of items to be shown in addition to the query results.
@@ -168,11 +168,12 @@ export declare class QueryListComponent {
168
168
  * @param scrollTo If `true`, the list will scroll to the top after dropping
169
169
  * in the items. Default is `true`.
170
170
  */
171
- dropItems(items: Record<string, unknown>[], scrollTo?: boolean): void;
171
+ dropItems(items: T[], scrollTo?: boolean): void;
172
172
  /**
173
173
  * Selects multiple items in the list.
174
174
  */
175
175
  multiSelect(index: number[]): void;
176
+ select(index: number): void;
176
177
  /**
177
178
  * Clear the current selection.
178
179
  * @param silent If `true`, the `itemSelect` event will not be emitted.
@@ -185,6 +186,6 @@ export declare class QueryListComponent {
185
186
  runTransformerAgain(): void;
186
187
  changePage(pe: PageEvent): void;
187
188
  goToPage(page: number): void;
188
- static ɵfac: i0.ɵɵFactoryDeclaration<QueryListComponent, never>;
189
- static ɵcmp: i0.ɵɵComponentDeclaration<QueryListComponent, "yuv-query-list", never, { "query": { "alias": "query"; "required": false; "isSignal": true; }; "idProperty": { "alias": "idProperty"; "required": false; "isSignal": true; }; "transformer": { "alias": "transformer"; "required": false; "isSignal": true; }; "preventChangeUntil": { "alias": "preventChangeUntil"; "required": false; "isSignal": true; }; "autoSelect": { "alias": "autoSelect"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "enableDragSelect": { "alias": "enableDragSelect"; "required": false; "isSignal": true; }; "multiselect": { "alias": "multiselect"; "required": false; "isSignal": true; }; "selfHandleSelection": { "alias": "selfHandleSelection"; "required": false; "isSignal": true; }; }, { "itemSelect": "itemSelect"; "dragSelectChange": "dragSelectChange"; "itemDoubleClick": "itemDoubleClick"; "queryResult": "queryResult"; }, ["itemTemplate", "emptyTemplate"], never, true, never>;
189
+ static ɵfac: i0.ɵɵFactoryDeclaration<QueryListComponent<any>, never>;
190
+ static ɵcmp: i0.ɵɵComponentDeclaration<QueryListComponent<any>, "yuv-query-list", never, { "query": { "alias": "query"; "required": false; "isSignal": true; }; "idProperty": { "alias": "idProperty"; "required": false; "isSignal": true; }; "transformer": { "alias": "transformer"; "required": false; "isSignal": true; }; "preventChangeUntil": { "alias": "preventChangeUntil"; "required": false; "isSignal": true; }; "autoSelect": { "alias": "autoSelect"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "enableDragSelect": { "alias": "enableDragSelect"; "required": false; "isSignal": true; }; "multiselect": { "alias": "multiselect"; "required": false; "isSignal": true; }; "selfHandleSelection": { "alias": "selfHandleSelection"; "required": false; "isSignal": true; }; }, { "itemSelect": "itemSelect"; "dragSelectChange": "dragSelectChange"; "itemDoubleClick": "itemDoubleClick"; "queryResult": "queryResult"; }, ["itemTemplate", "emptyTemplate"], never, true, never>;
190
191
  }
@@ -16,7 +16,7 @@ export declare class TileListComponent implements OnInit {
16
16
  menuComponent: Signal<TileActionsMenuComponent | undefined>;
17
17
  menu: Signal<import("@angular/material/menu").MatMenu | null>;
18
18
  emptyContent: Signal<ElementRef<any> | undefined>;
19
- list: Signal<QueryListComponent>;
19
+ list: Signal<QueryListComponent<TileData>>;
20
20
  menuTriggers: Signal<readonly MatMenuTrigger[]>;
21
21
  transformer: (res: SearchResultItem[]) => {
22
22
  actions: Action[];
@@ -125,12 +125,14 @@ export declare class TileListComponent implements OnInit {
125
125
  contextMenuHandler(event: MouseEvent, index: number): void;
126
126
  executeAction(t: InnerTileData, a: Action, evt: Event): void;
127
127
  selectById(ids: string[]): void;
128
- selectByIndex(idx: number, evt?: MouseEvent | KeyboardEvent): void;
128
+ multiSelect(index: number[]): void;
129
+ select(index: number): void;
129
130
  onQueryResult(e: {
130
131
  totalCount: number;
131
132
  }): void;
132
133
  onListItemsSelect(sel: number[]): void;
133
134
  refresh(): void;
135
+ dropItems(objects: DmsObject[]): void;
134
136
  applyFlavor(flavor: ObjectFlavor): void;
135
137
  /**
136
138
  * Updates an item in the list at the specified index with the provided value.
@@ -1,202 +0,0 @@
1
- {
2
- "yuv.action-menu.action.copy.dms.object.description": "",
3
- "yuv.action-menu.action.copy.dms.object.label": "Kopieren",
4
- "yuv.action-menu.action.cut.dms.object.description": "",
5
- "yuv.action-menu.action.cut.dms.object.label": "Ausschneiden",
6
- "yuv.action-menu.action.delete.dms.object.confirm.cancel": "Abbrechen",
7
- "yuv.action-menu.action.delete.dms.object.confirm.message": "Möchten Sie die ausgewählen Objekte wirklich löschen?",
8
- "yuv.action-menu.action.delete.dms.object.confirm.ok": "Löschen",
9
- "yuv.action-menu.action.delete.dms.object.description": "Löscht das Objekt.",
10
- "yuv.action-menu.action.delete.dms.object.label": "Löschen",
11
- "yuv.action-menu.action.delete.error.403": "Sie haben keine Berechtigung, das Objekt zu löschen.",
12
- "yuv.action-menu.action.delete.error.404": "Das Objekt konnte nicht gefunden werden.",
13
- "yuv.action-menu.action.delete.error.default": "Das Objekt konnte nicht gelöscht werden.",
14
- "yuv.action-menu.action.download.dms.object.content.description": "Lädt die Dokumentdatei des Objekts herunter.",
15
- "yuv.action-menu.action.download.dms.object.content.label": "Dokumentdatei herunterladen",
16
- "yuv.clipboard.button.cancel": "Abbrechen",
17
- "yuv.clipboard.button.paste": "Einfügen",
18
- "yuv.clipboard.text.copy.multiple": "{{count}} Elemente kopiert",
19
- "yuv.clipboard.text.copy.single": "1 Element kopiert",
20
- "yuv.clipboard.text.cut.multiple": "{{count}} Elemente ausgeschnitten",
21
- "yuv.clipboard.text.cut.single": "1 Element ausgeschnitten",
22
- "yuv.confirm.cancel": "Abbrechen",
23
- "yuv.confirm.confirm": "Bestätigen",
24
- "yuv.object-form-element.error.date.invalid": "Bitte geben Sie ein gültiges Datum ein.",
25
- "yuv.object-form-element.error.daterange.invalid": "Bitte geben Sie einen gültigen Datumsbereich an.",
26
- "yuv.object-form-element.error.daterangeorder.invalid": "Das Von-Datum ist später als das Bis-Datum.",
27
- "yuv.object-form-element.error.maxlength": "Die Eingabe darf max. {{maxLength}} Zeichen enthalten.",
28
- "yuv.object-form-element.error.maxvalue": "Die Eingabe darf nicht mehr als {{maxValue}} sein.",
29
- "yuv.object-form-element.error.minlength": "Die Eingabe muss min. {{minLength}} Zeichen enthalten.",
30
- "yuv.object-form-element.error.minmax": "Die Eingabe muss zwischen {{minValue}} und {{maxValue}} liegen.",
31
- "yuv.object-form-element.error.minvalue": "Die Eingabe darf nicht weniger als {{minValue}} sein.",
32
- "yuv.object-form-element.error.number": "Bitte geben Sie einen numerischen Wert ein.",
33
- "yuv.object-form-element.error.number.precision": "Die Anzahl der Vorkommastellen ist nicht korrekt: max. {{prePointDigits}}.",
34
- "yuv.object-form-element.error.number.scale": "Die Anzahl der Nachkommastellen ist nicht korrekt: max. {{scale}}.",
35
- "yuv.object-form-element.error.numberrange.invalid": "Bitte geben Sie einen gültigen Zahlenbereich an.",
36
- "yuv.object-form-element.error.numberrangeorder.invalid": "Der Von-Wert ist größer als der Bis-Wert.",
37
- "yuv.object-form-element.error.required": "Pflichtfeld",
38
- "yuv.object-form-element.error.string.classification.email": "Bitte geben Sie eine gültige E-Mail-Adresse ein.",
39
- "yuv.object-form-element.error.string.classification.phone": "Bitte geben Sie eine gültige Telefonnummer ein.",
40
- "yuv.object-form-element.error.string.classification.url": "Bitte geben Sie eine gültige URL ein.",
41
- "yuv.object-form-element.error.string.regex.nomatch": "Die Eingabe entspricht nicht den Vorgaben.",
42
- "yuv.object-form-element.error.string.whitespaces": "Die Eingabe enthält nur Leerzeichen.",
43
- "yuv.retention-badge.retain": "Aufbewahrung {{from}} - {{until}}",
44
- "yuv.calendar.time.label": "Uhrzeit",
45
- "yuv.form.element.data.grid.add-row.button.tooltip": "Zeile hinzufügen",
46
- "yuv.form.element.data.grid.copy": "Kopieren",
47
- "yuv.form.element.data.grid.edit": "Bearbeiten",
48
- "yuv.form.element.data.grid.edit.add": "Hinzufügen",
49
- "yuv.form.element.data.grid.edit.cancel": "Abbrechen",
50
- "yuv.form.element.data.grid.edit.headline": "Bearbeiten Sie die Tabellenzeile '{{headline}}'.",
51
- "yuv.form.element.data.grid.noData": "Keine Daten verfügbar",
52
- "yuv.form.element.data.grid.remove": "Entfernen",
53
- "yuv.form.element.data.grid.row.button.actions.tooltip": "Aktionsmenü öffnen",
54
- "yuv.form.element.datetime.calendar.cancel": "Abbrechen",
55
- "yuv.form.element.datetime.calendar.select": "Auswählen",
56
- "yuv.form.element.datetime.calendar.today": "Heute",
57
- "yuv.form.element.organization-set.classify.icon.title": "Gruppe",
58
- "yuv.form.element.organization.classify.icon.title": "Benutzer",
59
- "yuv.form.element.organization.user.not-found": "Benutzer nicht gefunden",
60
- "yuv.form.element.range-select-date.custom.overlay.button.apply": "Anwenden",
61
- "yuv.form.element.range-select-date.custom.overlay.title": "Benutzerdefinierter Zeitraum",
62
- "yuv.form.element.range-select-date.option.any": "Beliebiges Datum",
63
- "yuv.form.element.range-select-date.option.custom": "Zeitraum festlegen",
64
- "yuv.form.element.range-select-date.option.lastMonth": "Letzter Monat",
65
- "yuv.form.element.range-select-date.option.lastWeek": "Letzte Woche",
66
- "yuv.form.element.range-select-date.option.lastYear": "Letztes Jahr",
67
- "yuv.form.element.range-select-date.option.thisMonth": "Dieser Monat",
68
- "yuv.form.element.range-select-date.option.thisWeek": "Diese Woche",
69
- "yuv.form.element.range-select-date.option.thisYear": "Dieses Jahr",
70
- "yuv.form.element.range-select-date.option.today": "Heute",
71
- "yuv.form.element.range-select-date.option.yesterday": "Gestern",
72
- "yuv.form.element.range-select-filesize.option.any": "Beliebige Größe",
73
- "yuv.form.element.range-select-filesize.option.large": "Groß (10-100 MB)",
74
- "yuv.form.element.range-select-filesize.option.medium": "Mittel (1-10 MB)",
75
- "yuv.form.element.range-select-filesize.option.small": "Klein (<1 MB)",
76
- "yuv.form.element.range-select-filesize.option.verylarge": "Sehr groß (>100 MB)",
77
- "yuv.object-metadata.button.save": "Speichern",
78
- "yuv.audit.fetch.error": "Historieneinträge konnten nicht geladen werden",
79
- "yuv.audit.label.create.metadata": "Objekt wurde erstellt",
80
- "yuv.audit.label.create.metadata.withcontent": "Objekt wurde mit Dokumentdatei erstellt",
81
- "yuv.audit.label.create.tag": "Tag wurde erstellt",
82
- "yuv.audit.label.delete": "Objekt wurde gelöscht",
83
- "yuv.audit.label.delete.content": "Dokumentdatei wurde gelöscht",
84
- "yuv.audit.label.delete.marked": "Objekt wurde zur Löschung vorgesehen",
85
- "yuv.audit.label.delete.tag": "Tag wurde gelöscht",
86
- "yuv.audit.label.delete.version": "Dokumentversion wurde gelöscht",
87
- "yuv.audit.label.get.content": "Dokumentdatei wurde gelesen",
88
- "yuv.audit.label.get.custom": "Alle sonstigen Ereignisse",
89
- "yuv.audit.label.get.metadata": "Metadaten wurden gelesen",
90
- "yuv.audit.label.get.rendition.pdf": "PDF-Rendition wurde angefordert",
91
- "yuv.audit.label.get.rendition.text": "Text-Rendition wurde angefordert",
92
- "yuv.audit.label.get.rendition.thumbnail": "Minituransicht wurde angefordert",
93
- "yuv.audit.label.paging.next": "zur nächsten Seite",
94
- "yuv.audit.label.paging.prev": "zur vorherigen Seite",
95
- "yuv.audit.label.update.content": "Dokumentdatei wurde geändert",
96
- "yuv.audit.label.update.metadata": "Metadaten wurden geändert",
97
- "yuv.audit.label.update.metadata.withcontent": "Metadaten und Dokumentdatei wurden geändert",
98
- "yuv.audit.label.update.move": "Objekt wurde verschoben",
99
- "yuv.audit.label.update.move.content": "Dokumentdatei wurde verschoben",
100
- "yuv.audit.label.update.restore": "Alte Version wurde wiederhergestellt",
101
- "yuv.audit.label.update.restore.more": "Wiederhergestellt aus Version {{version}}",
102
- "yuv.audit.label.update.tag": "Tag wurde geändert",
103
- "yuv.audit.result.empty": "Es wurden keine Historieneinträge gefunden",
104
- "yuv.audit.timeline": "Historienzeitleiste",
105
- "yuv.object-details.tabs.content.title": "Inhalt",
106
- "yuv.object-metadata.button.reset": "Änderungen verwerfen",
107
- "yuv.object-metadata.context.load.error": "Das Objekt ist nicht verfügbar. Entweder wurde das Objekt gelöscht oder die Zugriffsrechte haben sich geändert.",
108
- "yuv.object-metadata.empty.message": "Das Objekt hat keine Metadaten.",
109
- "yuv.object-metadata.pending-changes.alert": "Sie bearbeiten gerade die Metadaten eines ungespeicherten Formulars. Ungespeicherte Daten gehen verloren.",
110
- "yuv.object-metadata.save.error": "Das Dokument kann im Moment nicht gespeichert werden.",
111
- "yuv.object-metadata.tabs.history.title": "Historie",
112
- "yuv.object-metadata.tabs.indexdata.title": "Metadaten",
113
- "yuv.object-flavor.apply-flavor.button.apply": "Anwenden",
114
- "yuv.object-flavor.apply-flavor.button.cancel": "Abbrechen",
115
- "yuv.object-flavor.apply-flavor.headline": "Typ '{{name}}' hinzufügen",
116
- "yuv.object-flavor.button.add": "Typ hinzufügen",
117
- "yuv.object-flavor.button.clear-selection": "Auswahl aufheben",
118
- "yuv.object-flavor.flavor.remove.confirm.message": "Möchten Sie den Typ '{{flavor}}' wirklich entfernen?",
119
- "yuv.object-flavor.label": "Typen",
120
- "yuv.object-flavor.picker.button.cancel": "Abbrechen",
121
- "yuv.object-flavor.picker.text": "Typen sind Erweiterungen für Dateien, die zusätzliche Informationen zu deren Inhalt/Bedeutung bereitstellen.",
122
- "yuv.object-flavor.picker.title": "Typ hinzufügen",
123
- "yuv.object-preview.tiff-warning": "Dieses Dokument ist nicht die Original-TIFF-Datei, sondern nur eine Repräsentation. TIFF-Dateien werden nicht für die Vorschau unterstützt. Bitte laden Sie das Dokument herunter, um das Original anzuzeigen.",
124
- "cm.app.cases.action.add-link.search.relation.label": "Verweistyp",
125
- "yuv.object-relationship.action.add-relationship.description": "",
126
- "yuv.object-relationship.action.add-relationship.label": "Verweis hinzufügen",
127
- "yuv.object-relationship.add-relation.error-message": "Fehler beim Hinzufügen des Verweises.",
128
- "yuv.object-relationship.add-relationship.action.cancel": "Abbrechen",
129
- "yuv.object-relationship.add-relationship.action.submit": "Verweis hinzufügen",
130
- "yuv.object-relationship.add-relationship.error.invalidRelationTargetCombination": "Der ausgewählte Verweistyp ist für das gewählte Zielobjekt nicht gültig.",
131
- "yuv.object-relationship.add-relationship.headline": "Neuen Verweis hinzufügen",
132
- "yuv.object-relationship.add-relationship.target-search.label": "Zielobjekt",
133
- "yuv.object-relationship.add.tooltip": "Fügt einen neuen Verweis hinzu",
134
- "yuv.object-relationship.delete-relation.confirm-message": "Sind Sie sicher, dass Sie den ausgewählten Verweis löschen möchten?",
135
- "yuv.object-relationship.delete-relation.error-message": "Fehler beim Löschen des ausgewählten Verweises.",
136
- "yuv.object-relationship.delete-relation.tooltip": "Löscht den ausgewählten Verweis",
137
- "yuv.object-relationship.download.tooltip": "Als Bild herunterladen",
138
- "yuv.object-relationship.list.incoming": "Eingehende Verweise",
139
- "yuv.object-relationship.list.outgoing": "Ausgehende Verweise",
140
- "yuv.object-relationship.mode.graph.tooltip": "Graphansicht",
141
- "yuv.object-relationship.mode.list.tooltip": "Listenansicht",
142
- "yuv.object-relationship.no-relations": "Keine Verweise gefunden.",
143
- "yuv.object-relationship.node-summary.open-object.button": "Öffnen",
144
- "yuv.object-relationship.selected.add-relationship.tooltip": "Fügt einen neuen Verweis hinzu",
145
- "yuv.object-relationship.selected.expand.tooltip": "Erweitert den ausgewählten Verweis",
146
- "yuv.object-summary-data.base.headline": "Basismetadaten",
147
- "yuv.object-summary.load.error": "Fehler beim Laden der Zusammenfassung",
148
- "yuv.object-versions.actions.download": "Version herunterladen",
149
- "yuv.object-versions.actions.restore": "Version wiederherstellen",
150
- "yuv.object-versions.actions.restore.confirm.message": "Möchten Sie die Version {{version}} wirklich wiederherstellen?",
151
- "yuv.object-versions.error.fetch-versions": "Versionen konnten nicht geladen werden",
152
- "yuv.object-versions.list.version": "Version {{version}}",
153
- "yuv.object-versions.tabs.content.title": "Inhalt",
154
- "yuv.object-versions.tabs.indexdata.title": "Metadaten",
155
- "yuv.table.renderer.moreEntries": "Es werden nur die ersten 10 Einträge angezeigt. Insgesamt: {{ count }}",
156
- "yuv.sequence-list.form.nextAssignee": "Empfänger",
157
- "yuv.sequence-list.form.task": "Aufgabe",
158
- "yuv.simple-search.clear": "Löschen",
159
- "yuv.simple-search.label": "Suchen",
160
- "yuv.simple-search.submit": "Suche starten",
161
- "yuv.sort.ascending": "Aufsteigend",
162
- "yuv.sort.descending": "Absteigend",
163
- "yuv.sort.tooltip": "Sortieren",
164
- "yuv.tile-config.button.close": "Schließen",
165
- "yuv.tile-config.button.reset": "Zurücksetzen",
166
- "yuv.tile-config.button.save": "Änderungen speichern",
167
- "yuv.tile-config.icon-select.pick": "Icon auswählen",
168
- "yuv.tile-config.icon-select.reset": "Zurücksetzen",
169
- "yuv.tile-config.slot.action.headline": "Aktionen",
170
- "yuv.tile-config.slot.icon.headline": "Icon",
171
- "yuv.tile-config.slot.property.headline": "Attribut",
172
- "yuv.tile-config.title": "Trefferlistenkonfiguration für {{bucket}}",
173
- "yuv.tile-config.trigger.tooltip": "Trefferlistenkonfiguration",
174
- "yuv.tile-list.item.actions-menu.button.tooltip": "Aktionsmenü öffnen",
175
- "yuv.upload-progress-overlay.error.403": "Sie haben nicht die erforderlichen Berechtigungen, um die Datei hochzuladen.",
176
- "yuv.upload-progress-overlay.error.default": "Die Datei konnte nicht hochgeladen werden.",
177
- "yuv.upload-progress.header.uploaded": "{{count}} Datei(en) hochgeladen",
178
- "yuv.upload-progress.header.uploading": "Hochladen von {{count}} Datei(en)",
179
- "yuv.widget-grid.button.cancel": "Abbrechen",
180
- "yuv.widget-grid.button.save": "Speichern",
181
- "yuv.widget-grid.empty": "Es wurden noch keine Widgets zu diesem Workspace hinzugefügt.",
182
- "yuv.widget-grid.empty.create": "Workspace bearbeiten",
183
- "yuv.widget-grid.widget-picker.empty": "Es sind keine Widgets verfügbar.",
184
- "yuv.widget-grid.widget-picker.title": "Widgets",
185
- "yuv.widget-grid.widget.add.label": "Widget hinzufügen",
186
- "yuv.widget-grid.widget.add.tooltip": "Widget hinzufügen",
187
- "yuv.widget-grid.widget.edit.tooltip": "Widget bearbeiten",
188
- "yuv.widget-grid.widget.noop.label": "Nicht gefunden",
189
- "yuv.widget-grid.widget.remove.tooltip": "Widget entfernen",
190
- "yuv.widget-grid.workspaces.edit.cancel": "Abbrechen",
191
- "yuv.widget-grid.workspaces.edit.save": "Speichern",
192
- "yuv.widget-grid.workspaces.edit.title": "Workspace",
193
- "yuv.widget-grid.workspaces.editMode.cancel": "Verwerfen",
194
- "yuv.widget-grid.workspaces.editMode.save": "Änderungen speichern",
195
- "yuv.widget-grid.workspaces.empty": "Keine Workspaces gefunden",
196
- "yuv.widget-grid.workspaces.empty.button.create": "Workspace erstellen",
197
- "yuv.widget-grid.workspaces.workspace.delete.confirm.message": "Möchten Sie den Workspace '{{label}}' wirklich löschen?",
198
- "yuv.widget-grid.workspaces.workspace.label": "Workspace",
199
- "yuv.widget-grid.workspaces.workspace.menu.create": "Workspace erstellen",
200
- "yuv.widget-grid.workspaces.workspace.menu.delete": "Workspace löschen",
201
- "yuv.widget-grid.workspaces.workspace.menu.edit": "Workspace bearbeiten"
202
- }