@yuuvis/client-framework 3.19.0 → 3.20.1

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 (24) hide show
  1. package/fesm2022/yuuvis-client-framework-datepicker.mjs +90 -34
  2. package/fesm2022/yuuvis-client-framework-datepicker.mjs.map +1 -1
  3. package/fesm2022/yuuvis-client-framework-forms.mjs +14 -5
  4. package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
  5. package/fesm2022/yuuvis-client-framework-object-details.mjs +2 -1
  6. package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -1
  7. package/fesm2022/yuuvis-client-framework-object-flavor.mjs +2 -1
  8. package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -1
  9. package/fesm2022/yuuvis-client-framework-object-form.mjs +3 -1
  10. package/fesm2022/yuuvis-client-framework-object-form.mjs.map +1 -1
  11. package/fesm2022/yuuvis-client-framework-object-relationship.mjs +9 -3
  12. package/fesm2022/yuuvis-client-framework-object-relationship.mjs.map +1 -1
  13. package/fesm2022/yuuvis-client-framework-object-summary.mjs +4 -1
  14. package/fesm2022/yuuvis-client-framework-object-summary.mjs.map +1 -1
  15. package/fesm2022/yuuvis-client-framework-renderer.mjs +22 -11
  16. package/fesm2022/yuuvis-client-framework-renderer.mjs.map +1 -1
  17. package/fesm2022/yuuvis-client-framework-smart-search.mjs +54 -14
  18. package/fesm2022/yuuvis-client-framework-smart-search.mjs.map +1 -1
  19. package/lib/assets/i18n/en.json +4 -4
  20. package/package.json +6 -6
  21. package/types/yuuvis-client-framework-datepicker.d.ts +16 -1
  22. package/types/yuuvis-client-framework-object-form.d.ts +6 -0
  23. package/types/yuuvis-client-framework-renderer.d.ts +17 -4
  24. package/types/yuuvis-client-framework-smart-search.d.ts +29 -6
@@ -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.19.0",
3
+ "version": "3.20.1",
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.19.0",
12
- "@yuuvis/client-shell-core": "^3.19.0",
13
- "@yuuvis/client-components": "^3.19.0",
11
+ "@yuuvis/client-core": "^3.20.1",
12
+ "@yuuvis/client-shell-core": "^3.20.1",
13
+ "@yuuvis/client-components": "^3.20.1",
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.19.0",
21
- "@yuuvis/media-viewer": "^4.0.0",
20
+ "@yuuvis/material": "^3.20.1",
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"
@@ -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;
@@ -25,6 +25,12 @@ interface ObjectFormOptions {
25
25
  */
26
26
  data: Record<string, unknown>;
27
27
  objectId?: string;
28
+ /**
29
+ * ID of the object type (or secondary object type) the form model belongs to. Used to
30
+ * enrich form elements from the schema in the context of that type — a type may bind a
31
+ * shared property to its own dynamic catalog. Falls back to the form model's own id.
32
+ */
33
+ objectTypeId?: string;
28
34
  /**
29
35
  * whether or not to disable the complete form
30
36
  */
@@ -1,7 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { ComponentRef, Type } from '@angular/core';
3
3
  import { AuditEntry, SchemaResponseFieldDefinition, TranslateService, ResolvedObjectConfigItem, RendererType } from '@yuuvis/client-core';
4
- import * as dist_libs_yuuvis_client_core_types_yuuvis_client_core from 'dist/libs/yuuvis/client-core/types/yuuvis-client-core';
5
4
 
6
5
  /**
7
6
  * Abstract class to be extended by audit-entry renderers. The renderer controls the
@@ -71,9 +70,15 @@ declare abstract class AbstractRendererComponent<T = string, U = null> {
71
70
  propertyName: i0.InputSignal<string>;
72
71
  value: i0.InputSignal<T | null>;
73
72
  meta: i0.InputSignal<U | Record<string, unknown> | undefined>;
73
+ /**
74
+ * ID of the object type (or secondary object type) the property is rendered for, when known.
75
+ * Some schema attributes — most notably the dynamic `catalog` a property is bound to — may be
76
+ * overridden per type, and can only be resolved with that context.
77
+ */
78
+ objectTypeId: i0.InputSignal<string | undefined>;
74
79
  protected getProperty(): SchemaResponseFieldDefinition | undefined;
75
80
  static ɵfac: i0.ɵɵFactoryDeclaration<AbstractRendererComponent<any, any>, never>;
76
- static ɵcmp: i0.ɵɵComponentDeclaration<AbstractRendererComponent<any, any>, "yuv-abstract-renderer", never, { "propertyName": { "alias": "propertyName"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "meta": { "alias": "meta"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
81
+ static ɵcmp: i0.ɵɵComponentDeclaration<AbstractRendererComponent<any, any>, "yuv-abstract-renderer", never, { "propertyName": { "alias": "propertyName"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "meta": { "alias": "meta"; "required": false; "isSignal": true; }; "objectTypeId": { "alias": "objectTypeId"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
77
82
  }
78
83
 
79
84
  declare class BooleanRendererComponent extends AbstractRendererComponent {
@@ -184,7 +189,15 @@ declare class UnknownRendererComponent extends AbstractRendererComponent<any> {
184
189
  }
185
190
 
186
191
  type RendererComponent = IntegerRendererComponent | DecimalRendererComponent | DateTimeRendererComponent | IconRendererComponent | StringRendererComponent | BooleanRendererComponent | TableRendererComponent | I18nCatalogRendererComponent | DynamicCatalogRendererComponent;
187
- type RendererDirectiveInput = ResolvedObjectConfigItem;
192
+ /**
193
+ * Input of the `yuvRenderer` directive. `objectTypeId` is optional type context: a type may bind
194
+ * a shared property to its own dynamic catalog, and that override can only be resolved when the
195
+ * type (or secondary object type) the property is rendered for is known. Without it the renderer
196
+ * falls back to the global property definition.
197
+ */
198
+ type RendererDirectiveInput = ResolvedObjectConfigItem & {
199
+ objectTypeId?: string;
200
+ };
188
201
 
189
202
  /**
190
203
  * Service for managing property type renderers. Renderers are components that will render certain
@@ -223,7 +236,7 @@ declare class RendererService {
223
236
  declare class RendererDirective {
224
237
  #private;
225
238
  component: ComponentRef<RendererComponent>;
226
- yuvRenderer: i0.InputSignal<dist_libs_yuuvis_client_core_types_yuuvis_client_core.ResolvedObjectConfigItem | undefined>;
239
+ yuvRenderer: i0.InputSignal<RendererDirectiveInput | undefined>;
227
240
  static ɵfac: i0.ɵɵFactoryDeclaration<RendererDirective, never>;
228
241
  static ɵdir: i0.ɵɵDirectiveDeclaration<RendererDirective, "[yuvRenderer]", never, { "yuvRenderer": { "alias": "yuvRenderer"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
229
242
  }
@@ -247,7 +247,13 @@ declare class SmartSearchEditController {
247
247
  */
248
248
  activeFields: _angular_core.Signal<SuggestionItem[]>;
249
249
  suggestions: _angular_core.Signal<SuggestionItem[]>;
250
- /** Number of top-level query units: the full-text unit (when it has a term) plus each block. */
250
+ /**
251
+ * Whether the full-text unit contributes to the query — a term, a type restriction, or both.
252
+ * Drives its own muted styling and the joiner below it, so what reads as active matches what
253
+ * is actually queried (see {@link isFulltextActive}).
254
+ */
255
+ fulltextActive: _angular_core.Signal<boolean>;
256
+ /** Number of top-level query units: the full-text unit (when it contributes one) plus each block. */
251
257
  unitCount: _angular_core.Signal<number>;
252
258
  showCombinator: _angular_core.Signal<boolean>;
253
259
  cmisQuery: _angular_core.Signal<string>;
@@ -397,14 +403,30 @@ declare function isConditionUnset(cond: FieldCondition): boolean;
397
403
  declare function buildNodeClause(node: ConditionNode): string;
398
404
  /**
399
405
  * Build the whole-object full-text clause: a single `CONTAINS('term')` predicate, optionally scoped
400
- * to a column and AND-ed with a type restriction. Returns `''` when the term is blank.
406
+ * to a column and AND-ed with a type restriction.
407
+ *
408
+ * A type restriction on its own — types picked in the full-text bar's type filter with nothing
409
+ * typed — is a query in its own right ("show me everything of this type"), exactly like a type
410
+ * block carrying no conditions. So the picked types are returned alone in that case; only a unit
411
+ * with neither a term nor a picked type contributes nothing and yields `''`.
401
412
  *
402
413
  * @param fulltext The full-text unit. An empty `types` list means "all types".
403
- * @param scopeTypes The types the search is scoped to (the host's `types` allow-list). When
404
- * the unit picks no concrete type, "all types" means *any of these* — so the restriction is
405
- * still emitted. Pass an empty list for an unscoped search: then "all types" restricts nothing.
414
+ * @param scopeTypes The types the search is scoped to (the host's `types` allow-list). When the
415
+ * unit picks no concrete type, "all types" means *any of these* — so the restriction is still
416
+ * emitted. Pass an empty list for an unscoped search: then "all types" restricts nothing.
417
+ *
418
+ * The scope deliberately only narrows a *term* search. With nothing typed and no type picked the
419
+ * panel is simply untouched, and falling back to the scope there would turn it into a standing
420
+ * "everything in scope" query the moment it opens.
406
421
  */
407
422
  declare function buildFulltextClause(fulltext: FulltextSearch, scopeTypes?: SearchBlockType[]): string;
423
+ /**
424
+ * Whether the full-text unit contributes a clause to the query — a term, a type restriction, or
425
+ * both. Lives next to {@link buildFulltextClause} so the UI's notion of "this unit is active"
426
+ * (its muted styling, the joiner to the blocks below it, the unit count behind the AND/OR toggle)
427
+ * cannot drift from what actually ends up in the query.
428
+ */
429
+ declare function isFulltextActive(fulltext: FulltextSearch): boolean;
408
430
  /**
409
431
  * Assemble the full CMIS statement from the search state. Each unit — the
410
432
  * full-text clause plus every type block (type restriction `AND`-ed with its
@@ -581,6 +603,7 @@ declare class SmartSearchComponent {
581
603
  readonly showCombinator: _angular_core.Signal<boolean>;
582
604
  readonly suggestions: _angular_core.Signal<SuggestionItem[]>;
583
605
  readonly fulltext: _angular_core.WritableSignal<_yuuvis_client_framework_smart_search.FulltextSearch>;
606
+ readonly fulltextActive: _angular_core.Signal<boolean>;
584
607
  readonly objectTypes: _angular_core.Signal<_yuuvis_client_core.GenericObjectType[]>;
585
608
  readonly activeBlockFields: _angular_core.Signal<SuggestionItem[]>;
586
609
  readonly formMode: _angular_core.WritableSignal<boolean>;
@@ -774,5 +797,5 @@ declare class YuvSmartSearchModule {
774
797
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<YuvSmartSearchModule>;
775
798
  }
776
799
 
777
- export { SmartSearchComponent, YuvSmartSearchModule, buildCmisQuery, buildFulltextClause, buildNodeClause, isConditionGroup, isFieldCondition, isTableCondition };
800
+ export { SmartSearchComponent, YuvSmartSearchModule, buildCmisQuery, buildFulltextClause, buildNodeClause, isConditionGroup, isFieldCondition, isFulltextActive, isTableCondition };
778
801
  export type { BuildStep, Combinator, ConditionContainer, ConditionGroup, ConditionNode, FieldCondition, FulltextScope, FulltextSearch, SearchBlock, SearchBlockType, SmartSearchState, SuggestionItem, TableCondition };