ngx-edu-sharing-ui 9.1.4 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/assets/scss/mixins.scss +4 -4
  2. package/assets/scss/variables-scss.scss +6 -0
  3. package/assets/scss/variables.scss +2 -3
  4. package/esm2022/lib/actionbar/actionbar.component.mjs +13 -10
  5. package/esm2022/lib/common/edu-sharing-ui-common.module.mjs +8 -5
  6. package/esm2022/lib/directives/border-box-observer.directive.mjs +7 -7
  7. package/esm2022/lib/directives/check-text-overflow.directive.mjs +6 -6
  8. package/esm2022/lib/directives/drag-nodes/nodes-drag-source.directive.mjs +5 -5
  9. package/esm2022/lib/directives/drag-nodes/nodes-drag.directive.mjs +5 -5
  10. package/esm2022/lib/directives/drag-nodes/nodes-drop-target.directive.mjs +5 -5
  11. package/esm2022/lib/directives/focus-state.directive.mjs +5 -5
  12. package/esm2022/lib/directives/icon.directive.mjs +6 -6
  13. package/esm2022/lib/directives/infinite-scroll.directive.mjs +5 -5
  14. package/esm2022/lib/dropdown/dropdown.component.mjs +17 -11
  15. package/esm2022/lib/edu-sharing-ui-configuration.mjs +4 -4
  16. package/esm2022/lib/edu-sharing-ui.module.mjs +5 -5
  17. package/esm2022/lib/index.mjs +4 -1
  18. package/esm2022/lib/list-items/format-duration.pipe.mjs +4 -4
  19. package/esm2022/lib/list-items/list-base/list-base.component.mjs +5 -5
  20. package/esm2022/lib/list-items/list-collection-info/list-collection-info.component.mjs +5 -5
  21. package/esm2022/lib/list-items/list-counts/list-counts.component.mjs +4 -4
  22. package/esm2022/lib/list-items/list-items.module.mjs +5 -5
  23. package/esm2022/lib/list-items/list-node-license/list-node-license.component.mjs +5 -5
  24. package/esm2022/lib/list-items/list-node-replication-source/list-node-replication-source.component.mjs +5 -5
  25. package/esm2022/lib/list-items/list-node-workflow/list-node-workflow.component.mjs +6 -6
  26. package/esm2022/lib/list-items/list-text/list-text.component.mjs +12 -12
  27. package/esm2022/lib/list-items/list-widget.mjs +5 -5
  28. package/esm2022/lib/list-items/node-row/node-row.component.mjs +5 -5
  29. package/esm2022/lib/list-items/node-source.pipe.mjs +5 -5
  30. package/esm2022/lib/mds/mds-helper.service.mjs +5 -5
  31. package/esm2022/lib/mds/mds.module.mjs +5 -5
  32. package/esm2022/lib/node-entries/drag-preview/drag-preview.component.mjs +4 -4
  33. package/esm2022/lib/node-entries/entries-model.mjs +1 -1
  34. package/esm2022/lib/node-entries/items-cap.mjs +1 -1
  35. package/esm2022/lib/node-entries/list-item-label.pipe.mjs +5 -5
  36. package/esm2022/lib/node-entries/node-cache.mjs +1 -1
  37. package/esm2022/lib/node-entries/node-data-source-remote.mjs +1 -1
  38. package/esm2022/lib/node-entries/node-data-source.mjs +1 -1
  39. package/esm2022/lib/node-entries/node-entries-card/node-entries-card.component.mjs +8 -8
  40. package/esm2022/lib/node-entries/node-entries-card-grid/node-entries-card-grid.component.mjs +8 -7
  41. package/esm2022/lib/node-entries/node-entries-card-small/node-entries-card-small.component.mjs +8 -9
  42. package/esm2022/lib/node-entries/node-entries-global-options/node-entries-global-options.component.mjs +6 -6
  43. package/esm2022/lib/node-entries/node-entries-global.service.mjs +5 -5
  44. package/esm2022/lib/node-entries/node-entries-table/column-chooser/column-chooser.component.mjs +6 -6
  45. package/esm2022/lib/node-entries/node-entries-table/node-entries-table.component.mjs +10 -7
  46. package/esm2022/lib/node-entries/node-entries-templates.service.mjs +5 -5
  47. package/esm2022/lib/node-entries/node-entries-wrapper.component.mjs +54 -21
  48. package/esm2022/lib/node-entries/node-entries.component.mjs +7 -7
  49. package/esm2022/lib/node-entries/node-entries.module.mjs +5 -5
  50. package/esm2022/lib/node-entries/node-rating/node-rating.component.mjs +5 -5
  51. package/esm2022/lib/node-entries/node-stats-badges/node-stats-badges.component.mjs +6 -6
  52. package/esm2022/lib/node-entries/node-type-badge/node-type-badge.component.mjs +5 -5
  53. package/esm2022/lib/node-entries/option-button/option-button.component.mjs +7 -7
  54. package/esm2022/lib/node-entries/preview-image/preview-image.component.mjs +5 -5
  55. package/esm2022/lib/node-entries/sort-select-panel/sort-select-panel.component.mjs +6 -6
  56. package/esm2022/lib/node-url/node-url.component.mjs +5 -5
  57. package/esm2022/lib/pipes/file-size.pipe.mjs +5 -5
  58. package/esm2022/lib/pipes/format-date.pipe.mjs +5 -5
  59. package/esm2022/lib/pipes/node-icon.pipe.mjs +5 -5
  60. package/esm2022/lib/pipes/node-image-size.pipe.mjs +4 -4
  61. package/esm2022/lib/pipes/node-image.pipe.mjs +5 -5
  62. package/esm2022/lib/pipes/node-license.pipe.mjs +24 -0
  63. package/esm2022/lib/pipes/node-person-name.pipe.mjs +5 -5
  64. package/esm2022/lib/pipes/node-title.pipe.mjs +17 -8
  65. package/esm2022/lib/pipes/option-tooltip.pipe.mjs +5 -5
  66. package/esm2022/lib/pipes/property-slug.pipe.mjs +4 -4
  67. package/esm2022/lib/pipes/replace-chars.pipe.mjs +5 -5
  68. package/esm2022/lib/pipes/vcard-name.pipe.mjs +11 -5
  69. package/esm2022/lib/services/abstract/keyboard-shortcuts.service.mjs +4 -4
  70. package/esm2022/lib/services/accessibility.service.mjs +5 -5
  71. package/esm2022/lib/services/app-container.service.mjs +8 -5
  72. package/esm2022/lib/services/local-events.service.mjs +11 -4
  73. package/esm2022/lib/services/node-entries.service.mjs +9 -10
  74. package/esm2022/lib/services/node-helper.service.mjs +23 -7
  75. package/esm2022/lib/services/nodes-drag-drop.service.mjs +5 -5
  76. package/esm2022/lib/services/options-helper-data.service.mjs +6 -6
  77. package/esm2022/lib/services/render-helper.service.mjs +114 -0
  78. package/esm2022/lib/services/repo-url.service.mjs +5 -5
  79. package/esm2022/lib/services/search-helper.service.mjs +5 -5
  80. package/esm2022/lib/services/temporary-storage.service.mjs +5 -5
  81. package/esm2022/lib/services/ui.service.mjs +10 -10
  82. package/esm2022/lib/sort-dropdown/sort-dropdown.component.mjs +9 -9
  83. package/esm2022/lib/spinner/spinner.component.mjs +8 -8
  84. package/esm2022/lib/translations/translation-loader.mjs +45 -10
  85. package/esm2022/lib/translations/translations.module.mjs +10 -8
  86. package/esm2022/lib/translations/translations.service.mjs +26 -10
  87. package/esm2022/lib/types/api-models.mjs +1 -1
  88. package/esm2022/lib/types/injection-tokens.mjs +10 -1
  89. package/esm2022/lib/types/list-item.mjs +1 -1
  90. package/esm2022/lib/types/option-item.mjs +11 -1
  91. package/esm2022/lib/util/DateHelper.mjs +1 -1
  92. package/esm2022/lib/util/VCard.mjs +2 -2
  93. package/esm2022/lib/util/color-helper.mjs +1 -1
  94. package/esm2022/lib/util/duration-helper.mjs +1 -1
  95. package/esm2022/lib/util/helper.mjs +1 -1
  96. package/esm2022/lib/util/rest-helper.mjs +1 -1
  97. package/fesm2022/ngx-edu-sharing-ui.mjs +648 -373
  98. package/fesm2022/ngx-edu-sharing-ui.mjs.map +1 -1
  99. package/lib/actionbar/actionbar.component.d.ts +2 -1
  100. package/lib/common/edu-sharing-ui-common.module.d.ts +17 -16
  101. package/lib/dropdown/dropdown.component.d.ts +4 -3
  102. package/lib/index.d.ts +3 -0
  103. package/lib/list-items/list-text/list-text.component.d.ts +4 -5
  104. package/lib/list-items/list-widget.d.ts +1 -1
  105. package/lib/node-entries/entries-model.d.ts +3 -0
  106. package/lib/node-entries/node-data-source-remote.d.ts +2 -2
  107. package/lib/node-entries/node-entries-card-small/node-entries-card-small.component.d.ts +1 -3
  108. package/lib/node-entries/node-entries-wrapper.component.d.ts +9 -2
  109. package/lib/pipes/node-license.pipe.d.ts +14 -0
  110. package/lib/pipes/node-title.pipe.d.ts +3 -1
  111. package/lib/pipes/vcard-name.pipe.d.ts +1 -1
  112. package/lib/services/app-container.service.d.ts +2 -1
  113. package/lib/services/local-events.service.d.ts +7 -0
  114. package/lib/services/node-entries.service.d.ts +5 -2
  115. package/lib/services/render-helper.service.d.ts +24 -0
  116. package/lib/services/ui.service.d.ts +3 -2
  117. package/lib/sort-dropdown/sort-dropdown.component.d.ts +2 -2
  118. package/lib/translations/translation-loader.d.ts +3 -1
  119. package/lib/translations/translations.service.d.ts +1 -0
  120. package/lib/types/api-models.d.ts +9 -0
  121. package/lib/types/injection-tokens.d.ts +9 -0
  122. package/lib/types/list-item.d.ts +2 -2
  123. package/lib/types/option-item.d.ts +36 -25
  124. package/lib/util/ui-constants.d.ts +2 -2
  125. package/package.json +7 -7
@@ -64,7 +64,8 @@ export declare class ActionbarComponent implements OnChanges {
64
64
  optionsIn: OptionItem[];
65
65
  optionsAlways$: BehaviorSubject<OptionItem[]>;
66
66
  optionsMenu$: BehaviorSubject<OptionItem[]>;
67
- optionsToggle: OptionItem[];
67
+ optionsToggleBefore: OptionItem[];
68
+ optionsToggleAfter: OptionItem[];
68
69
  constructor(uiService: UIService, translate: TranslateService);
69
70
  private prepareOptions;
70
71
  getNumberOptions(): number;
@@ -12,23 +12,24 @@ import * as i10 from "../pipes/property-slug.pipe";
12
12
  import * as i11 from "../pipes/node-icon.pipe";
13
13
  import * as i12 from "../pipes/node-image.pipe";
14
14
  import * as i13 from "../pipes/node-image-size.pipe";
15
- import * as i14 from "../pipes/node-person-name.pipe";
16
- import * as i15 from "../pipes/node-title.pipe";
17
- import * as i16 from "../node-url/node-url.component";
18
- import * as i17 from "../pipes/option-tooltip.pipe";
19
- import * as i18 from "../pipes/replace-chars.pipe";
20
- import * as i19 from "../sort-dropdown/sort-dropdown.component";
21
- import * as i20 from "../pipes/vcard-name.pipe";
22
- import * as i21 from "@angular/common";
23
- import * as i22 from "@angular/material/menu";
24
- import * as i23 from "../spinner/spinner.component";
25
- import * as i24 from "@angular/material/button";
26
- import * as i25 from "@angular/material/tooltip";
27
- import * as i26 from "@angular/material/core";
28
- import * as i27 from "@ngx-translate/core";
29
- import * as i28 from "@angular/router";
15
+ import * as i14 from "../pipes/node-license.pipe";
16
+ import * as i15 from "../pipes/node-person-name.pipe";
17
+ import * as i16 from "../pipes/node-title.pipe";
18
+ import * as i17 from "../node-url/node-url.component";
19
+ import * as i18 from "../pipes/option-tooltip.pipe";
20
+ import * as i19 from "../pipes/replace-chars.pipe";
21
+ import * as i20 from "../sort-dropdown/sort-dropdown.component";
22
+ import * as i21 from "../pipes/vcard-name.pipe";
23
+ import * as i22 from "@angular/common";
24
+ import * as i23 from "@angular/material/menu";
25
+ import * as i24 from "../spinner/spinner.component";
26
+ import * as i25 from "@angular/material/button";
27
+ import * as i26 from "@angular/material/tooltip";
28
+ import * as i27 from "@angular/material/core";
29
+ import * as i28 from "@ngx-translate/core";
30
+ import * as i29 from "@angular/router";
30
31
  export declare class EduSharingUiCommonModule {
31
32
  static ɵfac: i0.ɵɵFactoryDeclaration<EduSharingUiCommonModule, never>;
32
- static ɵmod: i0.ɵɵNgModuleDeclaration<EduSharingUiCommonModule, [typeof i1.ActionbarComponent, typeof i2.BorderBoxObserverDirective, typeof i3.CheckTextOverflowDirective, typeof i4.DropdownComponent, typeof i5.FocusStateDirective, typeof i6.FormatDatePipe, typeof i7.FormatSizePipe, typeof i8.IconDirective, typeof i9.InfiniteScrollDirective, typeof i10.PropertySlugPipe, typeof i11.NodeIconPipe, typeof i12.NodeImagePipe, typeof i13.NodeImageSizePipe, typeof i14.NodePersonNamePipe, typeof i15.NodeTitlePipe, typeof i16.NodeUrlComponent, typeof i17.OptionTooltipPipe, typeof i18.ReplaceCharsPipe, typeof i19.SortDropdownComponent, typeof i20.VCardNamePipe], [typeof i21.CommonModule, typeof i22.MatMenuModule, typeof i23.SpinnerComponent, typeof i24.MatButtonModule, typeof i25.MatTooltipModule, typeof i26.MatRippleModule, typeof i27.TranslateModule, typeof i28.RouterModule], [typeof i1.ActionbarComponent, typeof i2.BorderBoxObserverDirective, typeof i3.CheckTextOverflowDirective, typeof i4.DropdownComponent, typeof i5.FocusStateDirective, typeof i6.FormatDatePipe, typeof i7.FormatSizePipe, typeof i8.IconDirective, typeof i9.InfiniteScrollDirective, typeof i10.PropertySlugPipe, typeof i11.NodeIconPipe, typeof i12.NodeImagePipe, typeof i13.NodeImageSizePipe, typeof i14.NodePersonNamePipe, typeof i15.NodeTitlePipe, typeof i16.NodeUrlComponent, typeof i19.SortDropdownComponent, typeof i23.SpinnerComponent, typeof i20.VCardNamePipe]>;
33
+ static ɵmod: i0.ɵɵNgModuleDeclaration<EduSharingUiCommonModule, [typeof i1.ActionbarComponent, typeof i2.BorderBoxObserverDirective, typeof i3.CheckTextOverflowDirective, typeof i4.DropdownComponent, typeof i5.FocusStateDirective, typeof i6.FormatDatePipe, typeof i7.FormatSizePipe, typeof i8.IconDirective, typeof i9.InfiniteScrollDirective, typeof i10.PropertySlugPipe, typeof i11.NodeIconPipe, typeof i12.NodeImagePipe, typeof i13.NodeImageSizePipe, typeof i14.NodeLicensePipe, typeof i15.NodePersonNamePipe, typeof i16.NodeTitlePipe, typeof i17.NodeUrlComponent, typeof i18.OptionTooltipPipe, typeof i19.ReplaceCharsPipe, typeof i20.SortDropdownComponent, typeof i21.VCardNamePipe], [typeof i22.CommonModule, typeof i23.MatMenuModule, typeof i24.SpinnerComponent, typeof i25.MatButtonModule, typeof i26.MatTooltipModule, typeof i27.MatRippleModule, typeof i28.TranslateModule, typeof i29.RouterModule], [typeof i1.ActionbarComponent, typeof i2.BorderBoxObserverDirective, typeof i3.CheckTextOverflowDirective, typeof i4.DropdownComponent, typeof i5.FocusStateDirective, typeof i6.FormatDatePipe, typeof i7.FormatSizePipe, typeof i8.IconDirective, typeof i9.InfiniteScrollDirective, typeof i10.PropertySlugPipe, typeof i11.NodeIconPipe, typeof i12.NodeImagePipe, typeof i13.NodeImageSizePipe, typeof i15.NodePersonNamePipe, typeof i16.NodeTitlePipe, typeof i17.NodeUrlComponent, typeof i20.SortDropdownComponent, typeof i24.SpinnerComponent, typeof i21.VCardNamePipe]>;
33
34
  static ɵinj: i0.ɵɵInjectorDeclaration<EduSharingUiCommonModule>;
34
35
  }
@@ -3,6 +3,7 @@ import { MatMenu, MatMenuTrigger } from '@angular/material/menu';
3
3
  import { OptionItem } from '../types/option-item';
4
4
  import { UIService } from '../services/ui.service';
5
5
  import { BehaviorSubject } from 'rxjs';
6
+ import { Node } from 'ngx-edu-sharing-api';
6
7
  import * as i0 from "@angular/core";
7
8
  /**
8
9
  * The dropdown is one base component of the action bar (showing more actions),
@@ -16,11 +17,11 @@ export declare class DropdownComponent implements OnChanges {
16
17
  options: OptionItem[];
17
18
  options$: BehaviorSubject<OptionItem[]>;
18
19
  /**
19
- * The object that should be returned via the option's callback.
20
+ * The objects that should be returned via the option's callback.
20
21
  *
21
22
  * Can be null
22
23
  */
23
- callbackObject: any;
24
+ callbackObjects: Node[];
24
25
  /**
25
26
  * Should disabled ("greyed out") options be shown or hidden?
26
27
  */
@@ -39,5 +40,5 @@ export declare class DropdownComponent implements OnChanges {
39
40
  /** Whether there are any enabled options so we can open the menu. */
40
41
  canShowDropdown(): boolean;
41
42
  static ɵfac: i0.ɵɵFactoryDeclaration<DropdownComponent, never>;
42
- static ɵcmp: i0.ɵɵComponentDeclaration<DropdownComponent, "es-dropdown", never, { "position": { "alias": "position"; "required": false; }; "options": { "alias": "options"; "required": false; }; "callbackObject": { "alias": "callbackObject"; "required": false; }; "showDisabled": { "alias": "showDisabled"; "required": false; }; "menuClass": { "alias": "menuClass"; "required": false; }; }, {}, never, never, false, never>;
43
+ static ɵcmp: i0.ɵɵComponentDeclaration<DropdownComponent, "es-dropdown", never, { "position": { "alias": "position"; "required": false; }; "options": { "alias": "options"; "required": false; }; "callbackObjects": { "alias": "callbackObjects"; "required": false; }; "showDisabled": { "alias": "showDisabled"; "required": false; }; "menuClass": { "alias": "menuClass"; "required": false; }; }, {}, never, never, false, never>;
43
44
  }
package/lib/index.d.ts CHANGED
@@ -37,6 +37,7 @@ export * from './pipes/format-date.pipe';
37
37
  export * from './pipes/node-icon.pipe';
38
38
  export * from './pipes/node-image-size.pipe';
39
39
  export * from './pipes/node-image.pipe';
40
+ export * from './pipes/node-license.pipe';
40
41
  export * from './pipes/node-person-name.pipe';
41
42
  export * from './pipes/node-title.pipe';
42
43
  export * from './pipes/vcard-name.pipe';
@@ -48,11 +49,13 @@ export * from './services/accessibility.service';
48
49
  export * from './services/app-container.service';
49
50
  export * from './services/local-events.service';
50
51
  export * from './services/node-helper.service';
52
+ export * from './services/node-entries.service';
51
53
  export * from './services/nodes-drag-drop.service';
52
54
  export * from './services/options-helper-data.service';
53
55
  export * from './services/repo-url.service';
54
56
  export * from './services/temporary-storage.service';
55
57
  export * from './services/ui.service';
58
+ export * from './services/render-helper.service';
56
59
  export * from './sort-dropdown/sort-dropdown.component';
57
60
  export * from './spinner/spinner.component';
58
61
  export * from './translations/fallback-translation-handler';
@@ -1,10 +1,10 @@
1
- import { ChangeDetectorRef, OnInit, SimpleChanges } from '@angular/core';
2
- import { MdsService, Node } from 'ngx-edu-sharing-api';
1
+ import { ChangeDetectorRef, OnInit } from '@angular/core';
2
+ import * as Constants from 'ngx-edu-sharing-api';
3
+ import { MdsService } from 'ngx-edu-sharing-api';
3
4
  import { BehaviorSubject } from 'rxjs';
4
5
  import { ListItem } from '../../types/list-item';
5
6
  import { ListWidget } from '../list-widget';
6
7
  import { NodeHelperService } from '../../services/node-helper.service';
7
- import * as Constants from 'ngx-edu-sharing-api';
8
8
  import * as i0 from "@angular/core";
9
9
  export declare class ListTextComponent extends ListWidget implements OnInit {
10
10
  private nodeHelper;
@@ -15,9 +15,8 @@ export declare class ListTextComponent extends ListWidget implements OnInit {
15
15
  readonly VCARD_FIELDS: string[];
16
16
  displayName$: BehaviorSubject<string>;
17
17
  constructor(nodeHelper: NodeHelperService, mds: MdsService, changeDetectorRef: ChangeDetectorRef);
18
- ngOnChanges(changes: SimpleChanges): Promise<void>;
19
18
  ngOnInit(): Promise<void>;
20
- getNode(): Node | Constants.Group | Constants.Person | Constants.Statistics;
19
+ getNode(): Constants.Node | Constants.Person | Constants.Group | Constants.Statistics;
21
20
  isUserProfileAttribute(attribute: string): boolean;
22
21
  getWorkflowStatus(): import("ngx-edu-sharing-ui").WorkflowDefinition;
23
22
  getI18n(item: ListItem): string;
@@ -7,7 +7,7 @@ import * as i0 from "@angular/core";
7
7
  export declare class ListWidget {
8
8
  get node(): Node | ProposalNode | Group | Person | Statistics;
9
9
  set node(value: Node | ProposalNode | Group | Person | Statistics);
10
- protected readonly nodeSubject: BehaviorSubject<Node | Group | Person | ProposalNode | Statistics>;
10
+ protected readonly nodeSubject: BehaviorSubject<Node | ProposalNode | Person | Group | Statistics>;
11
11
  get item(): ListItem;
12
12
  set item(value: ListItem);
13
13
  protected readonly itemSubject: BehaviorSubject<ListItem>;
@@ -5,6 +5,7 @@ import { ListItem, ListItemSort } from '../types/list-item';
5
5
  import { CanDrop, DragData, DropAction } from '../types/drag-drop';
6
6
  import { Node, GenericAuthority } from 'ngx-edu-sharing-api';
7
7
  import { ActionbarComponent } from '../actionbar/actionbar.component';
8
+ import { Observable } from 'rxjs';
8
9
  export type NodeRoot = 'MY_FILES' | 'COLLECTION_HOME' | 'SHARED_FILES' | 'MY_SHARED_FILES' | 'TO_ME_SHARED_FILES' | 'WORKFLOW_RECEIVE' | 'RECYCLE' | 'ALL_FILES';
9
10
  export declare enum NodeEntriesDisplayType {
10
11
  Table = 0,
@@ -76,6 +77,7 @@ export type GridConfig = {
76
77
  };
77
78
  export interface ListEventInterface<T extends NodeEntriesDataType> {
78
79
  updateNodes(nodes: void | T[]): void;
80
+ onDisplayTypeChange(): Observable<NodeEntriesDisplayType>;
79
81
  getDisplayType(): NodeEntriesDisplayType;
80
82
  setDisplayType(displayType: NodeEntriesDisplayType): void;
81
83
  showReorderColumnsDialog(): void;
@@ -85,6 +87,7 @@ export interface ListEventInterface<T extends NodeEntriesDataType> {
85
87
  * activate option (dropdown) generation
86
88
  */
87
89
  initOptionsGenerator(config: ListOptionsConfig): void | Promise<void>;
90
+ selectAll(): void;
88
91
  getSelection(): SelectionModel<T>;
89
92
  /**
90
93
  * triggered when nodes/objects are deleted and should not be shown in the list anymore
@@ -1,15 +1,15 @@
1
1
  import { NodeDataSource } from './node-data-source';
2
2
  import { GenericAuthority, Node } from 'ngx-edu-sharing-api';
3
- import { MatTableDataSourcePaginator } from '@angular/material/table';
4
3
  import { ActivatedRoute } from '@angular/router';
5
4
  import { PaginationStrategy } from './node-entries-global.service';
6
5
  import { Sort } from '@angular/material/sort';
7
6
  import { SortPanel } from '../types/list-item';
7
+ import { MatPaginator } from '@angular/material/paginator';
8
8
  export interface PaginationConfig {
9
9
  defaultPageSize: number;
10
10
  strategy: PaginationStrategy;
11
11
  }
12
- export declare abstract class NodeDataSourceRemote<T extends Node | GenericAuthority = Node, P extends MatTableDataSourcePaginator = MatTableDataSourcePaginator> extends NodeDataSource<T> {
12
+ export declare abstract class NodeDataSourceRemote<T extends Node | GenericAuthority = Node, P extends MatPaginator = MatPaginator> extends NodeDataSource<T> {
13
13
  abstract get paginator(): P | null;
14
14
  abstract set paginator(value: P | null);
15
15
  abstract get sortPanel(): SortPanel;
@@ -1,4 +1,3 @@
1
- import { OnChanges, SimpleChanges } from '@angular/core';
2
1
  import { Target } from '../../types/option-item';
3
2
  import { ClickSource, InteractionType } from '../entries-model';
4
3
  import { NodeEntriesTemplatesService } from '../node-entries-templates.service';
@@ -6,7 +5,7 @@ import { NodeEntriesService } from '../../services/node-entries.service';
6
5
  import { NodeHelperService } from '../../services/node-helper.service';
7
6
  import { Node } from 'ngx-edu-sharing-api';
8
7
  import * as i0 from "@angular/core";
9
- export declare class NodeEntriesCardSmallComponent<T extends Node> implements OnChanges {
8
+ export declare class NodeEntriesCardSmallComponent<T extends Node> {
10
9
  entriesService: NodeEntriesService<T>;
11
10
  nodeHelper: NodeHelperService;
12
11
  templatesService: NodeEntriesTemplatesService;
@@ -15,7 +14,6 @@ export declare class NodeEntriesCardSmallComponent<T extends Node> implements On
15
14
  readonly Target: typeof Target;
16
15
  node: T;
17
16
  constructor(entriesService: NodeEntriesService<T>, nodeHelper: NodeHelperService, templatesService: NodeEntriesTemplatesService);
18
- ngOnChanges(changes: SimpleChanges): void;
19
17
  optionsOnCard(): import("../../types/option-item").OptionItem[];
20
18
  openContextmenu(event: MouseEvent | Event): void;
21
19
  static ɵfac: i0.ɵɵFactoryDeclaration<NodeEntriesCardSmallComponent<any>, never>;
@@ -8,7 +8,7 @@ import { OptionItem, Scope } from '../types/option-item';
8
8
  import { NodeHelperService } from '../services/node-helper.service';
9
9
  import { ListItem } from '../types/list-item';
10
10
  import { TemporaryStorageService } from '../services/temporary-storage.service';
11
- import { Node } from 'ngx-edu-sharing-api';
11
+ import { Node, NodeService } from 'ngx-edu-sharing-api';
12
12
  import { OptionsHelperDataService } from '../services/options-helper-data.service';
13
13
  import { UIService } from '../services/ui.service';
14
14
  import * as i0 from "@angular/core";
@@ -17,6 +17,7 @@ export declare class NodeEntriesWrapperComponent<T extends NodeEntriesDataType>
17
17
  private temporaryStorageService;
18
18
  private ngZone;
19
19
  private entriesService;
20
+ private nodeService;
20
21
  optionsHelper: OptionsHelperDataService;
21
22
  private nodeHelperService;
22
23
  private uiService;
@@ -45,6 +46,10 @@ export declare class NodeEntriesWrapperComponent<T extends NodeEntriesDataType>
45
46
  columns: ListItem[];
46
47
  configureColumns: boolean;
47
48
  checkbox: boolean;
49
+ /**
50
+ * emits when the user re-configures the columns
51
+ * should be used in order to save the new configuration
52
+ */
48
53
  columnsChange: EventEmitter<ListItem[]>;
49
54
  globalOptions: OptionItem[];
50
55
  displayType: NodeEntriesDisplayType;
@@ -99,7 +104,7 @@ export declare class NodeEntriesWrapperComponent<T extends NodeEntriesDataType>
99
104
  private componentRef;
100
105
  private options;
101
106
  private destroyed;
102
- constructor(viewContainerRef: ViewContainerRef, temporaryStorageService: TemporaryStorageService, ngZone: NgZone, entriesService: NodeEntriesService<T>, optionsHelper: OptionsHelperDataService, nodeHelperService: NodeHelperService, uiService: UIService, templatesService: NodeEntriesTemplatesService, changeDetectorRef: ChangeDetectorRef, elementRef: ElementRef);
107
+ constructor(viewContainerRef: ViewContainerRef, temporaryStorageService: TemporaryStorageService, ngZone: NgZone, entriesService: NodeEntriesService<T>, nodeService: NodeService, optionsHelper: OptionsHelperDataService, nodeHelperService: NodeHelperService, uiService: UIService, templatesService: NodeEntriesTemplatesService, changeDetectorRef: ChangeDetectorRef, elementRef: ElementRef);
103
108
  ngOnInit(): void;
104
109
  ngOnChanges(changes?: {
105
110
  [key: string]: SimpleChange;
@@ -114,11 +119,13 @@ export declare class NodeEntriesWrapperComponent<T extends NodeEntriesDataType>
114
119
  */
115
120
  private getOutputBindings;
116
121
  getDisplayType(): NodeEntriesDisplayType;
122
+ onDisplayTypeChange(): import("rxjs").Observable<NodeEntriesDisplayType>;
117
123
  setDisplayType(displayType: NodeEntriesDisplayType): void;
118
124
  updateNodes(nodes: void | T[]): void;
119
125
  showReorderColumnsDialog(): void;
120
126
  addVirtualNodes(virtual: T[]): void;
121
127
  setOptions(options: ListOptions): void;
128
+ selectAll(): void;
122
129
  getSelection(): CustomSelectionModel<T>;
123
130
  initOptionsGenerator(config: ListOptionsConfig): Promise<void>;
124
131
  ngAfterViewInit(): void;
@@ -0,0 +1,14 @@
1
+ import { PipeTransform } from '@angular/core';
2
+ import { Node } from 'ngx-edu-sharing-api';
3
+ import { TranslateService } from '@ngx-translate/core';
4
+ import * as i0 from "@angular/core";
5
+ export type LicenseType = 'name';
6
+ export declare class NodeLicensePipe implements PipeTransform {
7
+ private translate;
8
+ constructor(translate: TranslateService);
9
+ transform(node: Node, args: {
10
+ type: LicenseType;
11
+ }): import("rxjs").Observable<any>;
12
+ static ɵfac: i0.ɵɵFactoryDeclaration<NodeLicensePipe, never>;
13
+ static ɵpipe: i0.ɵɵPipeDeclaration<NodeLicensePipe, "esNodeLicense", false>;
14
+ }
@@ -5,7 +5,9 @@ import { NodeRoot } from '../node-entries/entries-model';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class NodeTitlePipe implements PipeTransform {
7
7
  private translate;
8
- transform(node: Node | NodeRoot | 'HOME', args?: string[]): string;
8
+ transform(node: Node | NodeRoot | 'HOME', args?: {
9
+ type: 'name' | 'title';
10
+ }): string;
9
11
  constructor(translate: TranslateService);
10
12
  static ɵfac: i0.ɵɵFactoryDeclaration<NodeTitlePipe, never>;
11
13
  static ɵpipe: i0.ɵɵPipeDeclaration<NodeTitlePipe, "nodeTitle", false>;
@@ -4,7 +4,7 @@ import * as i0 from "@angular/core";
4
4
  export declare class VCardNamePipe implements PipeTransform {
5
5
  private translate;
6
6
  constructor(translate: TranslateService);
7
- transform(authority: string, args?: string[]): string;
7
+ transform(authority: string | string[], args?: string[]): string;
8
8
  static ɵfac: i0.ɵɵFactoryDeclaration<VCardNamePipe, never>;
9
9
  static ɵpipe: i0.ɵɵPipeDeclaration<VCardNamePipe, "vcardName", false>;
10
10
  }
@@ -1,5 +1,5 @@
1
1
  import { NgZone } from '@angular/core';
2
- import { Observable } from 'rxjs';
2
+ import { Observable, Subject } from 'rxjs';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
5
5
  * Provides methods on the container that hosts the application.
@@ -10,6 +10,7 @@ import * as i0 from "@angular/core";
10
10
  export declare class AppContainerService {
11
11
  private ngZone;
12
12
  private scrollContainer?;
13
+ scrollContainerChange: Subject<HTMLElement>;
13
14
  constructor(ngZone: NgZone);
14
15
  init(appElement: HTMLElement): void;
15
16
  /**
@@ -5,6 +5,13 @@ import * as i0 from "@angular/core";
5
5
  * An application-wide event broker.
6
6
  */
7
7
  export declare class LocalEventsService {
8
+ /**
9
+ * One or more nodes have been created
10
+ *
11
+ * Triggers when the full creation process is done, i.e. the metadata/edit dialog after uploading
12
+ * is closed
13
+ */
14
+ readonly nodesCreated: EventEmitter<Node[]>;
8
15
  /**
9
16
  * The metadata of one or more nodes have been updated.
10
17
  *
@@ -54,9 +54,12 @@ export declare class NodeEntriesService<T extends NodeEntriesDataType> {
54
54
  *
55
55
  * Updated when loading configuration and through user interaction.
56
56
  */
57
- columnsSubject: BehaviorSubject<ListItem[]>;
57
+ columnsSubject: BehaviorSubject<{
58
+ columns: ListItem[];
59
+ fromUser: boolean;
60
+ }>;
58
61
  get columns(): ListItem[];
59
- set columns(value: ListItem[]);
62
+ set columns(columns: ListItem[]);
60
63
  configureColumns: boolean;
61
64
  displayType: NodeEntriesDisplayType;
62
65
  selection: CustomSelectionModel<T>;
@@ -0,0 +1,24 @@
1
+ import { Injector } from '@angular/core';
2
+ import { RenderDataRequestWithToken } from 'ngx-rendering-service-api';
3
+ import { AboutService, Node, NodeServiceUnwrapped, UserService } from 'ngx-edu-sharing-api';
4
+ import { EduSharingUiConfiguration } from '../edu-sharing-ui-configuration';
5
+ import { OptionsHelperDataService } from './options-helper-data.service';
6
+ import * as i0 from "@angular/core";
7
+ export type CombinedRenderData = {
8
+ node: Node;
9
+ request?: RenderDataRequestWithToken;
10
+ error?: string;
11
+ };
12
+ export declare class RenderHelperService {
13
+ private injector;
14
+ private aboutService;
15
+ private nodeApiUnwrapped;
16
+ private configuration;
17
+ private userService;
18
+ private optionsHelperDataService;
19
+ constructor(injector: Injector, aboutService: AboutService, nodeApiUnwrapped: NodeServiceUnwrapped, configuration: EduSharingUiConfiguration, userService: UserService, optionsHelperDataService: OptionsHelperDataService);
20
+ getRenderData(nodeId: string, version?: string): Promise<CombinedRenderData>;
21
+ getRenderDataForLms(encodedNode: string, signature: string, jwt: string, renderUrl: string, encodedUser: string): Promise<CombinedRenderData>;
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<RenderHelperService, [null, null, null, null, null, { optional: true; }]>;
23
+ static ɵprov: i0.ɵɵInjectableDeclaration<RenderHelperService>;
24
+ }
@@ -2,6 +2,7 @@ import { ComponentFactoryResolver, ComponentRef, Injector, NgZone, Type, ViewCon
2
2
  import * as rxjs from 'rxjs';
3
3
  import { BehaviorSubject, Observable } from 'rxjs';
4
4
  import { OptionItem } from '../types/option-item';
5
+ import { Node } from 'ngx-edu-sharing-api';
5
6
  import * as i0 from "@angular/core";
6
7
  export declare class UIService {
7
8
  protected componentFactoryResolver: ComponentFactoryResolver;
@@ -30,8 +31,8 @@ export declare class UIService {
30
31
  * can be used by dropdown or action menus to update the state for the current element
31
32
  * @param options
32
33
  */
33
- updateOptionEnabledState(options: BehaviorSubject<OptionItem[]>, object?: Node | any): Promise<void>;
34
- filterToggleOptions(options: OptionItem[], toggle: boolean): OptionItem[];
34
+ updateOptionEnabledState(options: BehaviorSubject<OptionItem[]>, objects?: Node[]): Promise<void>;
35
+ filterToggleOptions(options: OptionItem[], toggle: boolean, togglePosition?: 'before' | 'after'): OptionItem[];
35
36
  /**
36
37
  * dynamically inject an angular component into a regular html dom element
37
38
  * @param componentFactoryResolver The resolver service
@@ -7,9 +7,9 @@ export declare class SortDropdownComponent {
7
7
  columns: ListItem[];
8
8
  sortBy: string;
9
9
  sortAscending: boolean;
10
- onSort: EventEmitter<SortEvent>;
10
+ sort: EventEmitter<SortEvent>;
11
11
  constructor();
12
12
  setSort(item: ListItem | any): void;
13
13
  static ɵfac: i0.ɵɵFactoryDeclaration<SortDropdownComponent, never>;
14
- static ɵcmp: i0.ɵɵComponentDeclaration<SortDropdownComponent, "es-sort-dropdown", never, { "columns": { "alias": "columns"; "required": false; }; "sortBy": { "alias": "sortBy"; "required": false; }; "sortAscending": { "alias": "sortAscending"; "required": false; }; }, { "onSort": "onSort"; }, never, never, false, never>;
14
+ static ɵcmp: i0.ɵɵComponentDeclaration<SortDropdownComponent, "es-sort-dropdown", never, { "columns": { "alias": "columns"; "required": false; }; "sortBy": { "alias": "sortBy"; "required": false; }; "sortAscending": { "alias": "sortAscending"; "required": false; }; }, { "sort": "sort"; }, never, never, false, never>;
15
15
  }
@@ -9,12 +9,13 @@ type Dictionary = {
9
9
  };
10
10
  export declare class TranslationLoader implements TranslateLoader {
11
11
  private assetsBasePath;
12
+ private additionalI18nProvider;
12
13
  private http;
13
14
  private configService;
14
15
  private configuration;
15
16
  private prefix;
16
17
  private suffix;
17
- static create(http: HttpClient, configService: ConfigService, configuration: EduSharingUiConfiguration, assetsBasePath?: string): TranslationLoader;
18
+ static create(http: HttpClient, configService: ConfigService, configuration: EduSharingUiConfiguration, assetsBasePath?: string, additionalI18nProvider?: (lang: string) => string[]): TranslationLoader;
18
19
  private constructor();
19
20
  private readonly source;
20
21
  /**
@@ -48,5 +49,6 @@ export declare class TranslationLoader implements TranslateLoader {
48
49
  */
49
50
  private applyOverrides;
50
51
  private replaceGenderCharacter;
52
+ private overrideWithObject;
51
53
  }
52
54
  export {};
@@ -28,6 +28,7 @@ export declare class TranslationsService {
28
28
  /** Same as `translate.currentLang`. */
29
29
  getLanguage(): string;
30
30
  getISOLanguage(): string;
31
+ getLocale(): string;
31
32
  static ɵfac: i0.ɵɵFactoryDeclaration<TranslationsService, [null, null, null, null, null, null, { optional: true; }]>;
32
33
  static ɵprov: i0.ɵɵInjectableDeclaration<TranslationsService>;
33
34
  }
@@ -1,4 +1,13 @@
1
1
  import { Node } from 'ngx-edu-sharing-api';
2
2
  export interface VirtualNode extends Node {
3
3
  virtual: boolean;
4
+ /**
5
+ * should the virtual node override an existing node
6
+ * (if unset, equals true)
7
+ */
8
+ override?: boolean;
9
+ /**
10
+ * observe this node for changes (i.e. connector nodes)
11
+ */
12
+ observe?: boolean;
4
13
  }
@@ -6,3 +6,12 @@ import { InjectionToken } from '@angular/core';
6
6
  * is the case when it is embedded as a web component into another website.
7
7
  */
8
8
  export declare const ASSETS_BASE_PATH: InjectionToken<string>;
9
+ /**
10
+ * custom additional uris to fetch language files from
11
+ *
12
+ * Might be used if additional angular modules require language data
13
+ *
14
+ * Example
15
+ *{provide: ADDITIONAL_I18N_PROVIDER, useValue: (lang: string) => { return ['/edu-sharing/assets/i18n/myI18n/' + lang + '.json']}},
16
+ */
17
+ export declare const ADDITIONAL_I18N_PROVIDER: InjectionToken<(lang: string) => string[]>;
@@ -1,5 +1,5 @@
1
1
  import { Sort, SortDirection } from '@angular/material/sort';
2
- import { Observable } from 'rxjs';
2
+ import { EventEmitter } from '@angular/core';
3
3
  export type ListItemType = 'NODE' | 'NODE_PROPOSAL' | 'COLLECTION' | 'ORG' | 'GROUP' | 'USER';
4
4
  /**
5
5
  * A list item info, which is basically a column
@@ -51,5 +51,5 @@ export declare class SortEvent extends ListItemSort {
51
51
  export interface SortPanel {
52
52
  active: string;
53
53
  direction: SortDirection;
54
- readonly sortChange: Observable<Sort>;
54
+ readonly sortChange: EventEmitter<Sort>;
55
55
  }
@@ -6,6 +6,7 @@
6
6
 
7
7
  */
8
8
  import { KeyboardShortcutCondition } from '../types/keyboard-shortcuts';
9
+ import { Node } from 'ngx-edu-sharing-api';
9
10
  export declare enum NodesRightMode {
10
11
  Local = 0,
11
12
  Effective = 1
@@ -29,6 +30,15 @@ export declare class OptionItem {
29
30
  * @type {boolean}
30
31
  */
31
32
  isToggle: boolean;
33
+ /**
34
+ * Only when @isToggle. is the toggle currently visible
35
+ */
36
+ isToggleVisible: boolean;
37
+ /**
38
+ * Only when @isToggle. Where to place the toggle, before or after all other actions
39
+ * @type {boolean}
40
+ */
41
+ togglePosition: 'before' | 'after';
32
42
  /**
33
43
  * If true, shows a line at the top.
34
44
  *
@@ -83,7 +93,7 @@ export declare class OptionItem {
83
93
  * Is handled by optionsHelper and may not be used otherwise
84
94
  * Please use @customShowCallback instead
85
95
  */
86
- showCallback: (node?: Node | any) => Promise<boolean>;
96
+ showCallback: (nodes?: Node[]) => Promise<boolean>;
87
97
  /**
88
98
  * A function called with the node as parm which should return true or false if the option should be shown for this node
89
99
  * Will be called by the optionsHelper
@@ -94,7 +104,7 @@ export declare class OptionItem {
94
104
  * Is handled by optionsHelper and may not be used otherwise
95
105
  * Please use @customEnabledCallback instead
96
106
  */
97
- enabledCallback: (node?: Node | any) => Promise<boolean>;
107
+ enabledCallback: (nodes?: Node[]) => Promise<boolean>;
98
108
  /**
99
109
  * A function called with the node as param which should return true or false if the option should be enabled or not
100
110
  * Will be called by the optionsHelper
@@ -178,16 +188,17 @@ export declare enum Scope {
178
188
  Stream = "Stream",
179
189
  CreateMenu = "CreateMenu",
180
190
  MediacenterNodesList = "MediacenterNodesList",
181
- Admin = "Admin"
191
+ Admin = "Admin",// Admin Tools / Debugging
192
+ DebugShowAll = "DebugShowAll"
182
193
  }
183
194
  export declare enum ElementType {
184
195
  Node = 0,
185
- NodeChild = 1,
186
- MapRef = 2,
196
+ NodeChild = 1,// Child object
197
+ MapRef = 2,// Map ref (link to another map)
187
198
  NodePublishedCopy = 3,
188
- NodeRevoked = 4,
189
- NodeBlockedImport = 5,
190
- NodeProposal = 6,
199
+ NodeRevoked = 4,// revoked copy / revoked published node
200
+ NodeBlockedImport = 5,// node with property ccm:importblocked == true
201
+ NodeProposal = 6,// node proposal for a collection
191
202
  Person = 7,
192
203
  Group = 8,
193
204
  SavedSearch = 9,
@@ -215,26 +226,26 @@ export declare class DefaultGroups {
215
226
  static Toggles: OptionGroup;
216
227
  }
217
228
  export declare enum Constrain {
218
- CollectionReference = 0,
219
- NoCollectionReference = 1,
220
- Directory = 2,
221
- Collections = 3,
222
- Files = 4,
223
- FilesAndDirectories = 5,
224
- Admin = 6,
225
- AdminOrDebug = 7,
226
- NoBulk = 8,
227
- NoSelection = 9,
228
- ClipboardContent = 10,
229
- AddObjects = 11,
230
- HomeRepository = 12,
231
- User = 13,
232
- NoScope = 14,
233
- ReurlMode = 15,
229
+ CollectionReference = 0,// option is only visible for collection references
230
+ NoCollectionReference = 1,// option is only visible for non-collection references
231
+ Directory = 2,// only visible for directories (ccm:map)
232
+ Collections = 3,// only visible for collections
233
+ Files = 4,// only visible for files (ccm:io)
234
+ FilesAndDirectories = 5,// only visible for files and directories (ccm:io / ccm:map) - no collections!
235
+ Admin = 6,// only visible if user is admin or esDebug is enabled on window component
236
+ AdminOrDebug = 7,// only visible if user is admin or esDebug is enabled on window component
237
+ NoBulk = 8,// No support for bulk (multiple objects)
238
+ NoSelection = 9,// Only visible when currently no element is selected
239
+ ClipboardContent = 10,// Only visible when the clipboard has content
240
+ AddObjects = 11,// Only visible when it is possible to add objects into the current list
241
+ HomeRepository = 12,// Only visible when the nodes are from the local (home) repository
242
+ User = 13,// Only visible when a user is present and logged in
243
+ NoScope = 14,// Only visible when no current scope (i.e "safe" scope) is set
244
+ ReurlMode = 15,// Only visible when a reurl is present (called to pick object from lms)
234
245
  LTIMode = 16
235
246
  }
236
247
  export declare enum Target {
237
- List = 0,
248
+ List = 0,// Target is the ListTableComponent
238
249
  ListDropdown = 1,
239
250
  Actionbar = 2,
240
251
  CreateMenu = 3
@@ -12,7 +12,7 @@ export declare class UIConstants {
12
12
  static QUERY_PARAM_LIST_VIEW_TYPE: string;
13
13
  }
14
14
  export declare enum OPEN_URL_MODE {
15
- Current = 0,
16
- Blank = 1,
15
+ Current = 0,// Current Window, or In App browser on cordova
16
+ Blank = 1,// New Window, or In App browser on cordova
17
17
  BlankSystemBrowser = 2
18
18
  }
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "ngx-edu-sharing-ui",
3
- "version": "9.1.4",
3
+ "version": "10.0.0",
4
4
  "license": "GNU GPL v2",
5
5
  "description": "Angular components for Edu-Sharing UX parts",
6
6
  "peerDependencies": {
7
- "@angular/cdk": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0",
8
- "@angular/common": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0",
9
- "@angular/core": "^^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0",
10
- "@angular/material": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0",
7
+ "@angular/cdk": ">=^14.0.0",
8
+ "@angular/common": ">=^14.0.0",
9
+ "@angular/core": ">=^14.0.0 ",
10
+ "@angular/material": ">=^14.0.0",
11
11
  "material-design-icons": "^3.0.1",
12
- "@ngx-translate/core": "^14.0.0 || ^15.0.0",
13
- "angular-material-css-vars": "^3.0.0",
12
+ "@ngx-translate/core": ">=^15.0.0",
13
+ "angular-material-css-vars": "^6.0.0 || ^7.0.0",
14
14
  "rxjs": "^6.6.7 || ^7.0.0"
15
15
  },
16
16
  "dependencies": {