@mediusinc/mng-commons 5.4.0-rc.0 → 5.4.0-rc.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 (54) hide show
  1. package/esm2022/core/helpers/object.mjs +8 -1
  2. package/esm2022/table/api/data-providers/table.data-provider.mjs +12 -6
  3. package/esm2022/table/api/models/table-event.model.mjs +1 -1
  4. package/esm2022/table/components/table/table.component.mjs +14 -7
  5. package/esm2022/tableview/action/components/action/action.component.mjs +2 -2
  6. package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +31 -17
  7. package/esm2022/tableview/action/components/table/action-table.component.mjs +4 -4
  8. package/esm2022/tableview/action/services/view-container.service.mjs +1 -1
  9. package/esm2022/tableview/api/action/models/execution/view-container.model.mjs +1 -1
  10. package/esm2022/tableview/api/editor/data-providers/editor.data-provider.mjs +9 -2
  11. package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +18 -1
  12. package/esm2022/tableview/api/editor/models/form-editor.event.mjs +1 -1
  13. package/esm2022/tableview/api/editor/models/form-editor.interface.mjs +1 -1
  14. package/esm2022/tableview/api/tableview/data-providers/tableview.data-provider.mjs +18 -6
  15. package/esm2022/tableview/editor/components/editor/auto-save-status/auto-save-status.component.mjs +82 -0
  16. package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +164 -14
  17. package/esm2022/tableview/editor/helpers/editor-autosave.mjs +49 -0
  18. package/esm2022/tableview/editor/models/editor-auto-save-preview.model.mjs +2 -0
  19. package/esm2022/tableview/editor/services/form-editor.service.mjs +1 -1
  20. package/esm2022/tableview/index.mjs +3 -1
  21. package/fesm2022/mediusinc-mng-commons-core.mjs +7 -0
  22. package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
  23. package/fesm2022/mediusinc-mng-commons-table-api.mjs +11 -5
  24. package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
  25. package/fesm2022/mediusinc-mng-commons-table.mjs +13 -6
  26. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  27. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +42 -6
  28. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  29. package/fesm2022/mediusinc-mng-commons-tableview.mjs +322 -40
  30. package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
  31. package/i18n/en.json +14 -0
  32. package/i18n/sl.json +14 -0
  33. package/package.json +1 -1
  34. package/table/api/data-providers/table.data-provider.d.ts +14 -5
  35. package/table/api/models/table-event.model.d.ts +4 -3
  36. package/table/components/table/table.component.d.ts +11 -2
  37. package/tableview/action/components/editor/injector-context/action-editor-injector-context.component.d.ts +4 -0
  38. package/tableview/action/components/table/action-table.component.d.ts +2 -2
  39. package/tableview/action/services/view-container.service.d.ts +6 -5
  40. package/tableview/api/action/models/execution/view-container.model.d.ts +7 -24
  41. package/tableview/api/editor/data-providers/editor.data-provider.d.ts +10 -1
  42. package/tableview/api/editor/descriptors/editor.descriptor.d.ts +5 -0
  43. package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +1 -1
  44. package/tableview/api/editor/descriptors/field.descriptor.d.ts +1 -1
  45. package/tableview/api/editor/models/form-editor.event.d.ts +9 -0
  46. package/tableview/api/editor/models/form-editor.interface.d.ts +2 -2
  47. package/tableview/api/tableview/data-providers/tableview.data-provider.d.ts +10 -3
  48. package/tableview/editor/components/editor/auto-save-status/auto-save-status.component.d.ts +10 -0
  49. package/tableview/editor/components/editor/form-editor.component.d.ts +51 -4
  50. package/tableview/editor/helpers/editor-autosave.d.ts +17 -0
  51. package/tableview/editor/models/editor-auto-save-preview.model.d.ts +10 -0
  52. package/tableview/editor/services/form-editor.service.d.ts +2 -2
  53. package/tableview/index.d.ts +2 -0
  54. package/version-info.json +5 -5
package/i18n/en.json CHANGED
@@ -88,6 +88,20 @@
88
88
  "unsavedChangesConfirmation": {
89
89
  "header": "Are you sure you want to exit?",
90
90
  "message": "You have unsaved changes. Press No to go back and save these changes, or Yes to lose these changes."
91
+ },
92
+ "autoSave": {
93
+ "autosavedAt": "<strong>Autosaved locally</strong> at {{timestamp}}.",
94
+ "preview": "<strong>Preview:</strong> Autosaved state from {{timestamp}}.",
95
+ "previewCurrent": "<strong>Preview:</strong> Current state.",
96
+ "restored": "<strong>Restored:</strong> Locally autosaved state from {{timestamp}}.",
97
+ "restore": {
98
+ "title": "Restore editor's autosaved state from {{lastChange}}?",
99
+ "restore": "Restore",
100
+ "preview": "Preview",
101
+ "previewCurrent": "Preview current",
102
+ "previewAutosaved": "Preview autosaved",
103
+ "dismiss": "Dismiss"
104
+ }
91
105
  }
92
106
  },
93
107
  "mngAutocomplete": {
package/i18n/sl.json CHANGED
@@ -87,6 +87,20 @@
87
87
  "unsavedChangesConfirmation": {
88
88
  "header": "Ali res želite zapreti okno?",
89
89
  "message": "Imate neshranjene spremembe v formi. Če kliknite Ne, bo okno ostalo odprto, če Da, pa se bo okno zaprlo in spremembe bodo izbrisane."
90
+ },
91
+ "autoSave": {
92
+ "autosavedAt": "<strong>Lokalno shranjeno</strong> ob {{timestamp}}.",
93
+ "preview": "<strong>Pregled:</strong> Lokalno shranjeno iz {{timestamp}}.",
94
+ "previewCurrent": "<strong>Pregled:</strong> Current state.",
95
+ "restored": "<strong>Obnovitev:</strong> lokalno shranjeno stanje iz {{timestamp}}.",
96
+ "restore": {
97
+ "title": "Obnovitev samodejno shranjenega obrazca iz {{lastChange}}?",
98
+ "restore": "Obnovi",
99
+ "preview": "Preglej",
100
+ "previewCurrent": "Preglej trenutno stanje",
101
+ "previewAutosaved": "Preglej shranjeno stanje",
102
+ "dismiss": "Zavrni"
103
+ }
90
104
  }
91
105
  },
92
106
  "mngAutocomplete": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mediusinc/mng-commons",
3
- "version": "5.4.0-rc.0",
3
+ "version": "5.4.0-rc.1",
4
4
  "peerDependencies": {
5
5
  "@angular/animations": "^17.3.0 || ^18.0.0",
6
6
  "@angular/common": "^17.3.0 || ^18.0.0",
@@ -1,5 +1,6 @@
1
1
  import { Observable, Subject } from 'rxjs';
2
2
  import { ClassOptType, DataListParams, DataListResult, DataProviderInst, IDataProvider, ItemOrObservable, ServiceClassOptType } from '@mediusinc/mng-commons/core';
3
+ import { TableReloadEvent } from '../models/table-event.model';
3
4
  export type TableDataProviderGetAllFnType<Model = any, Service = undefined, Sorts = keyof Model, Filters extends keyof any = keyof Model, Return = ItemOrObservable<DataListResult<Model>>> = (params: DataListParams<Sorts, Filters>, service: Service, locale?: string) => Return;
4
5
  export type TableDataProviderGetAllEagerFnType<Model = any, Service = undefined, Return = ItemOrObservable<Model[]>> = (service: Service, locale?: string) => Return;
5
6
  export interface ITableDataProviderGetAll<Model, Service, Sorts = keyof Model, Filters extends keyof any = keyof Model> {
@@ -8,19 +9,27 @@ export interface ITableDataProviderGetAll<Model, Service, Sorts = keyof Model, F
8
9
  }
9
10
  export interface ITableDataProviderSupport<Sorts = any, Filters extends keyof any = any> {
10
11
  get isLazy(): boolean;
11
- get getAllReload$(): Observable<DataListParams<Sorts, Filters> | undefined>;
12
- getAllReload(queryParam?: DataListParams<Sorts, Filters>): void;
12
+ get tableReload$(): Observable<TableReloadEvent<Sorts, Filters>>;
13
+ /**
14
+ * @deprecated Use `reloadTable`.
15
+ */
16
+ getAllReload(event?: DataListParams<Sorts, Filters>): void;
17
+ reloadTable(event?: TableReloadEvent<Sorts, Filters>): void;
13
18
  }
14
19
  export type ITableDataProvider<Model = any, Service = any, Sorts = keyof Model, Filters extends keyof any = keyof Model, ModelClass = ClassOptType<Model>, ServiceClass = ServiceClassOptType<Service>> = IDataProvider<Model, Service, ModelClass, ServiceClass> & ITableDataProviderSupport<Sorts, Filters> & ITableDataProviderGetAll<Model, Service, Sorts, Filters>;
15
20
  export declare class TableDataProviderInst<Model, Service = any, Sorts = keyof Model, Filters extends keyof any = keyof Model, ModelClass = ClassOptType<Model>, ServiceClass = ServiceClassOptType<Service>> extends DataProviderInst<Model, Service, ModelClass, ServiceClass> implements ITableDataProvider<Model, Service, Sorts, Filters, ModelClass, ServiceClass> {
16
- protected readonly _getAllReloadSubject: Subject<DataListParams<Sorts, Filters> | undefined>;
21
+ protected readonly _reloadTableSubject: Subject<TableReloadEvent<Sorts, Filters>>;
17
22
  protected _isLazy: boolean;
18
23
  constructor(type: ModelClass, serviceType: ServiceClass);
19
24
  protected _getAll: TableDataProviderGetAllFnType<Model, Service, Sorts, Filters>;
20
25
  get isLazy(): boolean;
21
26
  get getAll(): TableDataProviderGetAllFnType<Model, Service, Sorts, Filters, ItemOrObservable<DataListResult<Model>>>;
22
- get getAllReload$(): Observable<DataListParams<Sorts, Filters> | undefined>;
27
+ get tableReload$(): Observable<TableReloadEvent<Sorts, Filters>>;
23
28
  withGetAll(fn: TableDataProviderGetAllFnType<Model, Service, Sorts, Filters>): this;
24
29
  withGetAllEagerly(fn: TableDataProviderGetAllEagerFnType<Model, Service>): this;
25
- getAllReload(queryParam?: DataListParams<Sorts, Filters>): void;
30
+ /**
31
+ * @deprecated Use ${reloadTable} instead.
32
+ */
33
+ getAllReload(params?: DataListParams<Sorts, Filters>): void;
34
+ reloadTable(event?: TableReloadEvent<Sorts, Filters>): void;
26
35
  }
@@ -11,7 +11,8 @@ export interface TableCellClickEvent<T> {
11
11
  rowIndex: number;
12
12
  event: Event;
13
13
  }
14
- export interface TableReloadEvent {
15
- resetParams: boolean;
16
- emitEvent: boolean;
14
+ export interface TableReloadEvent<Sorts = string, Filters extends keyof any = string> {
15
+ resetParams?: boolean;
16
+ emitEvent?: boolean;
17
+ params?: DataListParams<Sorts, Filters>;
17
18
  }
@@ -2,7 +2,7 @@ import { OnDestroy, Signal, TemplateRef, Type } from '@angular/core';
2
2
  import { MultiSelectChangeEvent } from 'primeng/multiselect';
3
3
  import { Table, TableColumnReorderEvent, TableLazyLoadEvent, TableRowReorderEvent } from 'primeng/table';
4
4
  import { ComponentDirective, DataListResult, TemplateDirective } from '@mediusinc/mng-commons/core';
5
- import { ColumnDescriptor, ITableDataProvider, TableCellClickEvent, TableDescriptorInst, TableLoadEvent } from '@mediusinc/mng-commons/table/api';
5
+ import { ColumnDescriptor, ITableDataProvider, TableCellClickEvent, TableDescriptorInst, TableLoadEvent, TableReloadEvent } from '@mediusinc/mng-commons/table/api';
6
6
  import { ColumnWithPreferences } from '../../models/column-preferences.model';
7
7
  import { DataListService } from '../../services/data-list.service';
8
8
  import * as i0 from "@angular/core";
@@ -80,7 +80,16 @@ export declare class TableComponent<Item = any, Service = undefined, Sorts = any
80
80
  private routerIsNavigationOutsideInProgress;
81
81
  constructor();
82
82
  ngOnDestroy(): void;
83
- reload(emitEvent?: boolean, resetParams?: boolean): void;
83
+ reload(): void;
84
+ /**
85
+ * @deprecated Use with `TableReloadEvent` object parameter.
86
+ */
87
+ reload(emitEvent: boolean): void;
88
+ reload(emitEvent?: TableReloadEvent<Sorts, Filters>): void;
89
+ /**
90
+ * @deprecated Use with `TableReloadEvent` object parameter.
91
+ */
92
+ reload(emitEvent: boolean, resetParams: boolean): void;
84
93
  onTableLazyLoad(event: TableLazyLoadEvent): void;
85
94
  onCellClick(event: Event, col: ColumnDescriptor<any, Item>, item: Item, idx: number): void;
86
95
  onSelectionChange(event: Array<Item>): void;
@@ -4,6 +4,7 @@ import { Observable } from 'rxjs';
4
4
  import { ActionData, IDataProvider, IdType } from '@mediusinc/mng-commons/core';
5
5
  import { ActionActivationTriggerEnum, ActionDescriptorInst, ActionEditorDescriptorInst, ActionEditorSubmitTypeEnum, FormEditorSubmitEvent, IActionEditorComponent, IActionInstance } from '@mediusinc/mng-commons/tableview/api';
6
6
  import { FormEditorComponent } from '../../../../editor/components/editor/form-editor.component';
7
+ import { EditorAutoSaveStatus } from '../../../../editor/models/editor-auto-save-preview.model';
7
8
  import { ActionInstance } from '../../../models/execution/action-instance.model';
8
9
  import * as i0 from "@angular/core";
9
10
  export declare class ActionEditorInjectorContextComponent<Item = any, Service = any> implements OnInit, OnDestroy, IActionEditorComponent {
@@ -42,6 +43,7 @@ export declare class ActionEditorInjectorContextComponent<Item = any, Service =
42
43
  private fetchExecutionSubscription?;
43
44
  formValue: import("@angular/core").WritableSignal<Item | undefined>;
44
45
  submitLoading: import("@angular/core").WritableSignal<boolean>;
46
+ autoSaveStatus: import("@angular/core").WritableSignal<EditorAutoSaveStatus | undefined>;
45
47
  private submitExecutionSubscription?;
46
48
  private lastSubmitItem?;
47
49
  private titleSubscription?;
@@ -54,6 +56,7 @@ export declare class ActionEditorInjectorContextComponent<Item = any, Service =
54
56
  updateItem(item: Item | undefined): void;
55
57
  triggerSubmit(): void;
56
58
  onValueChange(value: Item): void;
59
+ onAutoSave(value: EditorAutoSaveStatus): void;
57
60
  private fetchItem;
58
61
  private setEditorEnabled;
59
62
  private processActionInstance;
@@ -62,6 +65,7 @@ export declare class ActionEditorInjectorContextComponent<Item = any, Service =
62
65
  private onEscapePressed;
63
66
  closeWithUnsavedChangesConfirmation(callFromGuard?: boolean): Observable<boolean>;
64
67
  private showUnsavedChangesConfirmationDialog;
68
+ private onEditorReset;
65
69
  static ɵfac: i0.ɵɵFactoryDeclaration<ActionEditorInjectorContextComponent<any, any>, never>;
66
70
  static ɵcmp: i0.ɵɵComponentDeclaration<ActionEditorInjectorContextComponent<any, any>, "mng-action-editor-injector-context", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; }, { "actionRun": "actionRun"; "actionCancel": "actionCancel"; }, never, never, true, never>;
67
71
  }
@@ -2,7 +2,7 @@ import { QueryList, Signal, TemplateRef, Type } from '@angular/core';
2
2
  import { TableRowReorderEvent } from 'primeng/table';
3
3
  import { DataListResult, TemplateDirective } from '@mediusinc/mng-commons/core';
4
4
  import { TableComponent } from '@mediusinc/mng-commons/table';
5
- import { ITableDataProvider, TableCellClickEvent, TableDescriptorInst, TableLoadEvent } from '@mediusinc/mng-commons/table/api';
5
+ import { ITableDataProvider, TableCellClickEvent, TableDescriptorInst, TableLoadEvent, TableReloadEvent } from '@mediusinc/mng-commons/table/api';
6
6
  import { ActionDescriptorInst } from '@mediusinc/mng-commons/tableview/api';
7
7
  import { ActionInstance } from '../../models/execution/action-instance.model';
8
8
  import * as i0 from "@angular/core";
@@ -39,7 +39,7 @@ export declare class ActionTableComponent<Item = any, Service = undefined, Sorts
39
39
  rowClickActions: Signal<ActionDescriptorInst<any, any, any>[]>;
40
40
  rowInlineActions: Signal<ActionDescriptorInst<any, any, any>[]>;
41
41
  constructor();
42
- reload(emitEvent?: boolean, resetParams?: boolean): void;
42
+ reload(e?: TableReloadEvent<Sorts, Filters>): void;
43
43
  onCellClick(event: TableCellClickEvent<Item>): void;
44
44
  onSelectionChange(items: Array<Item>): void;
45
45
  onRowReorder(event: TableRowReorderEvent): void;
@@ -1,6 +1,7 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { IDataProvider } from '@mediusinc/mng-commons/core';
3
- import { ActionDescriptorInst, IViewContainer, ViewContainerEditorCloseEvent, ViewContainerEditorResetEvent, ViewContainerTableReloadEvent } from '@mediusinc/mng-commons/tableview/api';
3
+ import { TableReloadEvent } from '@mediusinc/mng-commons/table/api';
4
+ import { ActionDescriptorInst, EditorResetEvent, IViewContainer, ViewContainerEditorCloseEvent } from '@mediusinc/mng-commons/tableview/api';
4
5
  import { ActionInstance } from '../models/execution/action-instance.model';
5
6
  import * as i0 from "@angular/core";
6
7
  /**
@@ -13,10 +14,10 @@ export declare class ViewContainer<Item, Service = undefined> implements IViewCo
13
14
  private _tableReloadSubject;
14
15
  private _editorResetSubject;
15
16
  private _editorCloseSubject;
16
- get tableReload$(): Observable<ViewContainerTableReloadEvent>;
17
- reloadTable(event?: ViewContainerTableReloadEvent): void;
18
- get editorReset$(): Observable<ViewContainerEditorResetEvent<Item>>;
19
- resetEditor(event?: ViewContainerEditorResetEvent<Item> | undefined): void;
17
+ get tableReload$(): Observable<TableReloadEvent>;
18
+ reloadTable(event?: TableReloadEvent): void;
19
+ get editorReset$(): Observable<EditorResetEvent<Item>>;
20
+ resetEditor(event?: EditorResetEvent<Item> | undefined): void;
20
21
  get editorClose$(): Observable<ViewContainerEditorCloseEvent<Item>>;
21
22
  closeEditor(event?: ViewContainerEditorCloseEvent<Item>): void;
22
23
  static ɵfac: i0.ɵɵFactoryDeclaration<ViewContainer<any, any>, never>;
@@ -1,38 +1,21 @@
1
1
  import { WritableSignal } from '@angular/core';
2
2
  import { Observable } from 'rxjs';
3
- import { DataListParams, IDataProvider } from '@mediusinc/mng-commons/core';
3
+ import { IDataProvider } from '@mediusinc/mng-commons/core';
4
+ import { TableReloadEvent } from '@mediusinc/mng-commons/table/api';
5
+ import { EditorResetEvent } from '../../../editor/models/form-editor.event';
4
6
  import { ActionDescriptorInst } from '../../descriptors/action.descriptor';
5
7
  import { IActionInstance } from './action-instance.model';
6
8
  export interface IViewContainer<Item, Service, ActionInstance extends IActionInstance<Item, Service> = IActionInstance<Item, Service>> {
7
9
  dataProvider: WritableSignal<IDataProvider<Item, Service> | undefined>;
8
10
  routeTriggeredActionInstance: WritableSignal<ActionInstance | undefined>;
9
11
  actions: WritableSignal<Array<ActionDescriptorInst<Item>>>;
10
- tableReload$: Observable<ViewContainerTableReloadEvent>;
11
- editorReset$: Observable<ViewContainerEditorResetEvent<Item>>;
12
+ tableReload$: Observable<TableReloadEvent>;
13
+ editorReset$: Observable<EditorResetEvent<Item>>;
12
14
  editorClose$: Observable<ViewContainerEditorCloseEvent<Item>>;
13
- reloadTable(event?: ViewContainerTableReloadEvent): void;
14
- resetEditor(event?: ViewContainerEditorResetEvent<Item> | undefined): void;
15
+ reloadTable(event?: TableReloadEvent): void;
16
+ resetEditor(event?: EditorResetEvent<Item> | undefined): void;
15
17
  closeEditor(event?: ViewContainerEditorCloseEvent<Item>): void;
16
18
  }
17
- export interface ViewContainerTableReloadEvent {
18
- emitEvent?: boolean;
19
- resetParams?: boolean;
20
- params?: DataListParams;
21
- data?: {
22
- [key: string]: any;
23
- };
24
- }
25
- export interface ViewContainerEditorResetEvent<T> {
26
- emitEvent?: boolean;
27
- fetch?: boolean;
28
- item?: T;
29
- fields?: {
30
- [key: string]: unknown;
31
- };
32
- data?: {
33
- [key: string]: any;
34
- };
35
- }
36
19
  export interface ViewContainerEditorCloseEvent<T> {
37
20
  emitEvent?: boolean;
38
21
  item?: T;
@@ -1,4 +1,6 @@
1
+ import { Observable, Subject } from 'rxjs';
1
2
  import { ClassOptType, DataProviderInst, IDataProvider, IdType, ItemOrObservable, ServiceClassOptType } from '@mediusinc/mng-commons/core';
3
+ import { EditorResetEvent } from '../models/form-editor.event';
2
4
  export type EditorDataProviderFetchFnType<Model = any, Service = undefined, Id = IdType, Return = ItemOrObservable<Model>> = (id: Id, service: Service, locale: string | undefined) => Return;
3
5
  export type EditorDataProviderCreateFnType<Model = any, Service = undefined, Item = Model | undefined, Return = ItemOrObservable<Model>> = (item: Item, service: Service) => Return;
4
6
  export type EditorDataProviderUpdateFnType<Model = any, Service = undefined, Id = IdType, Item = Model | undefined, Return = ItemOrObservable<Model>> = (id: Id, item: Item, service: Service) => Return;
@@ -20,8 +22,13 @@ export interface IEditorDataProviderDelete<Model, Service> {
20
22
  withDelete(fn?: EditorDataProviderDeleteFnType<Model, Service>): this;
21
23
  }
22
24
  export type IEditorDataProviderFnsType<Model, Service> = IEditorDataProviderFetch<Model, Service> & IEditorDataProviderCreate<Model, Service> & IEditorDataProviderUpdate<Model, Service> & IEditorDataProviderDelete<Model, Service>;
23
- export type IEditorDataProvider<Model = any, Service = any, ModelClass = ClassOptType<Model>, ServiceClass = ServiceClassOptType<Service>> = IDataProvider<Model, Service, ModelClass, ServiceClass> & IEditorDataProviderFnsType<Model, Service>;
25
+ export interface IEditorDataProviderSupport<Model> {
26
+ get editorReset$(): Observable<EditorResetEvent<Model>>;
27
+ resetEditor(event?: EditorResetEvent<Model>): void;
28
+ }
29
+ export type IEditorDataProvider<Model = any, Service = any, ModelClass = ClassOptType<Model>, ServiceClass = ServiceClassOptType<Service>> = IDataProvider<Model, Service, ModelClass, ServiceClass> & IEditorDataProviderFnsType<Model, Service> & IEditorDataProviderSupport<Model>;
24
30
  export declare class EditorDataProviderInst<Model, Service = any, ModelClass = ClassOptType<Model>, ServiceClass = ServiceClassOptType<Service>> extends DataProviderInst<Model, Service, ModelClass, ServiceClass> implements IEditorDataProvider<Model, Service, ModelClass, ServiceClass> {
31
+ protected readonly _editorResetSubject: Subject<EditorResetEvent<Model>>;
25
32
  protected _fetch: EditorDataProviderFetchFnType<Model, Service>;
26
33
  protected _create?: EditorDataProviderCreateFnType<Model, Service>;
27
34
  protected _update?: EditorDataProviderUpdateFnType<Model, Service>;
@@ -31,6 +38,7 @@ export declare class EditorDataProviderInst<Model, Service = any, ModelClass = C
31
38
  get create(): EditorDataProviderCreateFnType<Model, Service, Model | undefined, ItemOrObservable<Model>> | undefined;
32
39
  get update(): EditorDataProviderUpdateFnType<Model, Service, IdType, Model | undefined, ItemOrObservable<Model>> | undefined;
33
40
  get delete(): EditorDataProviderDeleteFnType<Model, Service, IdType, Model | undefined, ItemOrObservable<Model | null>> | undefined;
41
+ get editorReset$(): Observable<EditorResetEvent<Model>>;
34
42
  /**
35
43
  * Sets the fetch function for the EditorDataProvider instance.
36
44
  *
@@ -72,4 +80,5 @@ export declare class EditorDataProviderInst<Model, Service = any, ModelClass = C
72
80
  * @typeparam Service The type of service used by this DataProvider.
73
81
  */
74
82
  withDelete(fn?: EditorDataProviderDeleteFnType<Model, Service>): this;
83
+ resetEditor(event?: EditorResetEvent<Model>): void;
75
84
  }
@@ -24,6 +24,8 @@ export declare class EditorDescriptorInst<EditorModel, ParentEditorModel = undef
24
24
  /** @ignore */ protected _fields: Array<AFieldDescriptor<any, EditorModel>>;
25
25
  /** @ignore */ protected _currentTabGroup?: FieldTabGroupDescriptor<EditorModel>;
26
26
  /** @ignore */ protected _currentGroup?: FieldGroupDescriptor<EditorModel>;
27
+ /** @ignore */ protected _autoSave?: boolean;
28
+ /** @ignore */ protected _autoSaveIdentifier?: string;
27
29
  /** @ignore */ protected _disabled: boolean;
28
30
  /** @ignore */ protected _isLocalized: boolean;
29
31
  /** @ignore */ protected _localizationLocaleProperty?: string;
@@ -60,6 +62,8 @@ export declare class EditorDescriptorInst<EditorModel, ParentEditorModel = undef
60
62
  get localizationLocaleProperty(): string | undefined;
61
63
  get localizationLocalizationProperty(): string | undefined;
62
64
  get localizationModel(): ModelDescriptor<any, import("@mediusinc/mng-commons/core").ClassOptType<any>> | undefined;
65
+ get autoSave(): boolean | undefined;
66
+ get autoSaveIdentifier(): string | undefined;
63
67
  /**
64
68
  * Creates new tab group. Next added fields are added to newly created tab group.
65
69
  * @param name Name of the group.
@@ -266,6 +270,7 @@ export declare class EditorDescriptorInst<EditorModel, ParentEditorModel = undef
266
270
  * @param opts Additional configuration for validation.
267
271
  */
268
272
  withValidationUnsafe<Value = EditorModel>(name: string, validator?: FormValidator<Value, ParentEditorModel>, message?: FormValidationMessage<Value, ParentEditorModel>, opts?: FieldValidationDescriptorOptsType): this;
273
+ withAutoSave(enabled?: boolean, autoSaveIdentifier?: string): this;
269
274
  /**
270
275
  * Creates a copy of editor descriptor object.
271
276
  */
@@ -71,7 +71,7 @@ export declare abstract class AFieldDescriptor<FieldModel, EditorModel, FieldVal
71
71
  [additionalProperties: string]: any;
72
72
  }> | undefined) => boolean) | undefined;
73
73
  get hiddenResetOnHide(): boolean | undefined;
74
- get updateOn(): "submit" | "change" | "blur";
74
+ get updateOn(): "change" | "blur" | "submit";
75
75
  get onInit(): CommonsFormlyHookFn<FieldValue, EditorModel> | undefined;
76
76
  get onChanges(): CommonsFormlyHookFn<FieldValue, EditorModel> | undefined;
77
77
  get afterContentInit(): CommonsFormlyHookFn<FieldValue, EditorModel> | undefined;
@@ -170,7 +170,7 @@ export declare class FieldInputDescriptor<EditorModel, FieldModel = FieldInputDe
170
170
  get locale(): string | undefined;
171
171
  get currency(): string | undefined;
172
172
  get currencyFromProperty(): string | undefined;
173
- get currencyDisplay(): "symbol" | "name" | "code";
173
+ get currencyDisplay(): "symbol" | "code" | "name";
174
174
  asHidden(): this;
175
175
  asLabel(): this;
176
176
  asText(opts?: FieldInputTextOptsType): this;
@@ -67,3 +67,12 @@ export interface FormEvent<FormValue, ParentFormValue = undefined> {
67
67
  }>;
68
68
  data?: FormEventData<FormValue>;
69
69
  }
70
+ export interface EditorResetEvent<Item> {
71
+ emitEvent?: boolean;
72
+ fetch?: boolean;
73
+ item?: Item;
74
+ fields?: Partial<Item>;
75
+ data?: {
76
+ [key: string]: any;
77
+ };
78
+ }
@@ -1,4 +1,4 @@
1
- import { InputSignal, WritableSignal } from '@angular/core';
1
+ import { InputSignal, InputSignalWithTransform, WritableSignal } from '@angular/core';
2
2
  import { AbstractControl, FormGroup, UntypedFormGroup } from '@angular/forms';
3
3
  import { FormlyFieldConfig, FormlyFormOptions } from '@ngx-formly/core';
4
4
  import { Message } from 'primeng/api';
@@ -29,7 +29,7 @@ export type FormEditorGetFormValueOpts = {
29
29
  };
30
30
  export interface IFormEditorComponent<Item, ParentItem = any> {
31
31
  descriptor: InputSignal<EditorDescriptorInst<Item>>;
32
- isFormDisabled: InputSignal<boolean>;
32
+ isFormDisabled: InputSignalWithTransform<boolean, unknown>;
33
33
  formMessages: WritableSignal<Message[]>;
34
34
  get form(): FormGroup<{
35
35
  [K in keyof Item]: AbstractControl<Item[K]>;
@@ -1,25 +1,32 @@
1
1
  import { ClassOptType, DataListParams, DataProviderInst, ServiceClassOptType } from '@mediusinc/mng-commons/core';
2
- import { ITableDataProvider, TableDataProviderGetAllEagerFnType, TableDataProviderGetAllFnType, TableDataProviderInst } from '@mediusinc/mng-commons/table/api';
2
+ import { ITableDataProvider, TableDataProviderGetAllEagerFnType, TableDataProviderGetAllFnType, TableDataProviderInst, TableReloadEvent } from '@mediusinc/mng-commons/table/api';
3
3
  import { EditorDataProviderCreateFnType, EditorDataProviderDeleteFnType, EditorDataProviderFetchFnType, EditorDataProviderInst, EditorDataProviderUpdateFnType, IEditorDataProvider } from '../../editor/data-providers/editor.data-provider';
4
+ import { EditorResetEvent } from '../../editor/models/form-editor.event';
4
5
  export type ITableviewDataProvider<Model = any, Service = any, Sorts = keyof Model, Filters extends keyof any = keyof Model, ModelClass = ClassOptType<Model>, ServiceClass = ServiceClassOptType<Service>> = IEditorDataProvider<Model, Service, ModelClass, ServiceClass> & ITableDataProvider<Model, Service, Sorts, Filters, ModelClass, ServiceClass>;
5
6
  export declare class TableviewDataProviderInst<Model, Service = any, Sorts = keyof Model, Filters extends keyof any = keyof Model, ModelClass = ClassOptType<Model>, ServiceClass = ServiceClassOptType<Service>> extends DataProviderInst<Model, Service, ModelClass, ServiceClass> implements ITableviewDataProvider<Model, Service, Sorts, Filters, ModelClass, ServiceClass> {
6
7
  protected readonly editorDataProvider: EditorDataProviderInst<Model, Service, ModelClass, ServiceClass>;
7
8
  protected readonly tableDataProvider: TableDataProviderInst<Model, Service, Sorts, Filters, ModelClass, ServiceClass>;
8
9
  constructor(type: ModelClass, serviceType: ServiceClass);
9
10
  get isLazy(): boolean;
10
- get getAllReload$(): import("rxjs").Observable<DataListParams<Sorts, Filters> | undefined>;
11
+ get tableReload$(): import("rxjs").Observable<TableReloadEvent<Sorts, Filters>>;
12
+ get editorReset$(): import("rxjs").Observable<EditorResetEvent<Model>>;
11
13
  get getAll(): TableDataProviderGetAllFnType<Model, Service, Sorts, Filters, import("@mediusinc/mng-commons/core").ItemOrObservable<import("@mediusinc/mng-commons/core").DataListResult<Model>>>;
12
14
  get fetch(): EditorDataProviderFetchFnType<Model, Service, import("@mediusinc/mng-commons/core").IdType, import("@mediusinc/mng-commons/core").ItemOrObservable<Model>>;
13
15
  get create(): EditorDataProviderCreateFnType<Model, Service, Model | undefined, import("@mediusinc/mng-commons/core").ItemOrObservable<Model>> | undefined;
14
16
  get update(): EditorDataProviderUpdateFnType<Model, Service, import("@mediusinc/mng-commons/core").IdType, Model | undefined, import("@mediusinc/mng-commons/core").ItemOrObservable<Model>> | undefined;
15
17
  get delete(): EditorDataProviderDeleteFnType<Model, Service, import("@mediusinc/mng-commons/core").IdType, Model | undefined, import("@mediusinc/mng-commons/core").ItemOrObservable<Model | null>> | undefined;
16
- getAllReload(queryParam?: DataListParams<Sorts, Filters>): void;
17
18
  withGetAll(fn: TableDataProviderGetAllFnType<Model, Service, Sorts, Filters>): this;
18
19
  withGetAllEagerly(fn: TableDataProviderGetAllEagerFnType<Model, Service>): this;
19
20
  withFetch(fn: EditorDataProviderFetchFnType<Model, Service>): this;
20
21
  withCreate(fn?: EditorDataProviderCreateFnType<Model, Service>): this;
21
22
  withUpdate(fn?: EditorDataProviderUpdateFnType<Model, Service>): this;
22
23
  withDelete(fn?: EditorDataProviderDeleteFnType<Model, Service>): this;
24
+ /**
25
+ * @deprecated Use ${reloadTable} instead.
26
+ */
27
+ getAllReload(params?: DataListParams<Sorts, Filters>): void;
28
+ reloadTable(event?: TableReloadEvent<Sorts, Filters>): void;
29
+ resetEditor(event?: EditorResetEvent<Model>): void;
23
30
  }
24
31
  export declare class DynamicTableviewDataProviderInst<Service = any, ServiceClass = ServiceClassOptType<Service>> extends TableviewDataProviderInst<any, Service, any, any, undefined, ServiceClass> {
25
32
  constructor(serviceType: ServiceClass);
@@ -0,0 +1,10 @@
1
+ import { EditorAutoSaveStatus } from '../../../models/editor-auto-save-preview.model';
2
+ import * as i0 from "@angular/core";
3
+ export declare class EditorAutoSaveStatusComponent {
4
+ status: import("@angular/core").InputSignal<EditorAutoSaveStatus | undefined>;
5
+ label: import("@angular/core").Signal<"mngEditor.autoSave.autosavedAt" | "mngEditor.autoSave.preview" | "mngEditor.autoSave.previewCurrent" | "mngEditor.autoSave.restored" | undefined>;
6
+ timestampDateFormat: import("@angular/core").Signal<"HH:mm:ss" | "dd. MM. yyyy HH:mm:ss">;
7
+ icon: import("@angular/core").Signal<"pi pi-save" | "pi pi-hourglass pi-spin" | "pi pi-eye" | "pi pi-sync" | undefined>;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<EditorAutoSaveStatusComponent, never>;
9
+ static ɵcmp: i0.ɵɵComponentDeclaration<EditorAutoSaveStatusComponent, "mng-editor-auto-save-status", never, { "status": { "alias": "status"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
10
+ }
@@ -2,21 +2,33 @@ import { ElementRef, OnDestroy, OnInit } from '@angular/core';
2
2
  import { AbstractControl, FormGroup, UntypedFormGroup } from '@angular/forms';
3
3
  import { FormlyFieldConfig } from '@ngx-formly/core';
4
4
  import { Message } from 'primeng/api';
5
+ import { IdType } from '@mediusinc/mng-commons/core';
5
6
  import { CommonsFormlyFormOptions, EditorDescriptorInst, FormEditorPatchFieldValueOpts, FormEditorResetFieldValueOpts, FormEditorResetFormModelOpts, FormEditorSetFieldValueOpts, FormEditorSubmitEvent, IFormEditorComponent } from '@mediusinc/mng-commons/tableview/api';
7
+ import { EditorAutoSavePreviewModel, EditorAutoSaveStatus } from '../../models/editor-auto-save-preview.model';
6
8
  import * as i0 from "@angular/core";
7
9
  export declare class FormEditorComponent<Item = any, ParentItem = any> implements IFormEditorComponent<Item, ParentItem>, OnInit, OnDestroy {
8
10
  private readonly formlyConfig;
9
11
  private readonly translateService;
10
12
  private readonly commons;
13
+ readonly cmpTypeName = "FormEditorComponent";
11
14
  private readonly logger;
12
15
  private readonly destroyRef;
13
16
  private readonly formService;
17
+ private readonly commonsStorageService;
18
+ private readonly router;
19
+ private autoSaveStorageKeyCompInit;
20
+ private autoSaveStorageKey;
14
21
  descriptor: import("@angular/core").InputSignal<EditorDescriptorInst<Item, undefined>>;
15
- submitLoading: import("@angular/core").InputSignal<boolean>;
16
- item: import("@angular/core").InputSignal<Item | undefined>;
17
- isFormDisabled: import("@angular/core").InputSignal<boolean>;
22
+ submitLoading: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
23
+ item: import("@angular/core").ModelSignal<Item | undefined>;
24
+ isFormDisabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
25
+ editorId: import("@angular/core").InputSignal<string | undefined>;
26
+ itemId: import("@angular/core").InputSignal<IdType | undefined>;
27
+ showAutoSaveStatus: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
18
28
  formSubmit: import("@angular/core").OutputEmitterRef<FormEditorSubmitEvent<Item>>;
19
29
  valueChange: import("@angular/core").OutputEmitterRef<Item>;
30
+ private autoSaveStatusSubject;
31
+ autoSaveStatus: import("@angular/core").OutputRef<EditorAutoSaveStatus>;
20
32
  submitButtonElementRef: import("@angular/core").Signal<ElementRef<any> | undefined>;
21
33
  private readonly _form;
22
34
  private readonly _formlyStateDisabledSubject;
@@ -26,6 +38,15 @@ export declare class FormEditorComponent<Item = any, ParentItem = any> implement
26
38
  private initialItemInput;
27
39
  private setterFields;
28
40
  formMessages: import("@angular/core").WritableSignal<Message[]>;
41
+ readonly restoreLocalStateButtonStyle: string;
42
+ readonly previewLocalStateButtonStyle: string;
43
+ readonly clearLocalStateButtonStyle: string;
44
+ autoSaveRestore: import("@angular/core").WritableSignal<EditorAutoSavePreviewModel<Item> | null>;
45
+ autoSave: import("@angular/core").Signal<EditorAutoSaveStatus | undefined>;
46
+ autoSavePreviewButtonLabel: import("@angular/core").Signal<"mngEditor.autoSave.restore.previewCurrent" | "mngEditor.autoSave.restore.previewAutosaved" | "mngEditor.autoSave.restore.preview">;
47
+ autoSaveShowRestore: import("@angular/core").Signal<boolean>;
48
+ private autoSavePreviewDisabledForm;
49
+ private autoSaveEventsSubscription?;
29
50
  get parent(): IFormEditorComponent<ParentItem, any> | undefined;
30
51
  get form(): FormGroup<{
31
52
  [K in keyof Item]: AbstractControl<Item[K]>;
@@ -56,9 +77,35 @@ export declare class FormEditorComponent<Item = any, ParentItem = any> implement
56
77
  patchFieldValueUnsafe(key: string, value: any, opts?: FormEditorPatchFieldValueOpts): boolean;
57
78
  resetFieldValue<Property extends keyof Item>(key: Property, value?: Item[Property], opts?: FormEditorResetFieldValueOpts): boolean;
58
79
  resetFieldValueUnsafe(key: string, value?: any, opts?: FormEditorResetFieldValueOpts): boolean;
80
+ /**
81
+ * Restores the saved local state.
82
+ * If local storage keys exist for local state and local timestamp, restore their corresponding values.
83
+ */
84
+ onAutoSaveRestore(): void;
85
+ /**
86
+ * Previews the saved local state.
87
+ * If local storage keys exist for local state and local timestamp, restore their corresponding values.
88
+ */
89
+ onAutoSavePreview(): void;
90
+ /**
91
+ * Removes local state from local storage.
92
+ * If local storage keys exist for local state and local timestamp, remove their corresponding values.
93
+ */
94
+ onAutoSaveDismiss(): void;
59
95
  private getFormModelFromItem;
60
96
  private findFormField;
61
97
  private isAnyFieldInvalid;
98
+ private autoSaveStartEventChangeListen;
99
+ private autoSaveStopValueChangeListen;
100
+ /**
101
+ * Saves the form value to localStorage if autoSave is enabled and the required keys are defined.
102
+ * @returns {void}
103
+ */
104
+ private autoSaveSaveToStorage;
105
+ /**
106
+ * Loads the value from the local storage if available
107
+ */
108
+ private autoSaveLoadSavedFromStorage;
62
109
  static ɵfac: i0.ɵɵFactoryDeclaration<FormEditorComponent<any, any>, never>;
63
- static ɵcmp: i0.ɵɵComponentDeclaration<FormEditorComponent<any, any>, "mng-form-editor", never, { "descriptor": { "alias": "descriptor"; "required": true; "isSignal": true; }; "submitLoading": { "alias": "submitLoading"; "required": false; "isSignal": true; }; "item": { "alias": "item"; "required": false; "isSignal": true; }; "isFormDisabled": { "alias": "isFormDisabled"; "required": false; "isSignal": true; }; }, { "formSubmit": "formSubmit"; "valueChange": "valueChange"; }, never, never, true, never>;
110
+ static ɵcmp: i0.ɵɵComponentDeclaration<FormEditorComponent<any, any>, "mng-form-editor", never, { "descriptor": { "alias": "descriptor"; "required": true; "isSignal": true; }; "submitLoading": { "alias": "submitLoading"; "required": false; "isSignal": true; }; "item": { "alias": "item"; "required": false; "isSignal": true; }; "isFormDisabled": { "alias": "isFormDisabled"; "required": false; "isSignal": true; }; "editorId": { "alias": "editorId"; "required": false; "isSignal": true; }; "itemId": { "alias": "itemId"; "required": false; "isSignal": true; }; "showAutoSaveStatus": { "alias": "showAutoSaveStatus"; "required": false; "isSignal": true; }; }, { "item": "itemChange"; "formSubmit": "formSubmit"; "valueChange": "valueChange"; "autoSaveStatus": "autoSaveStatus"; }, never, never, true, never>;
64
111
  }
@@ -0,0 +1,17 @@
1
+ import { IdType } from '@mediusinc/mng-commons/core';
2
+ import { EditorDescriptorInst } from '@mediusinc/mng-commons/tableview/api';
3
+ /**
4
+ * Generates a unique key for autosave data of an editor.
5
+ *
6
+ * @param {EditorDescriptorInst<Item>} descriptor - The editor descriptor instance.
7
+ * @param {Item | undefined} item - The item associated with the editor.
8
+ * @param {string} url - The URL of the editor.
9
+ * @param {Object} [opts] - An optional object containing additional options.
10
+ * @param {string} [opts.editorId] - The custom editor ID.
11
+ * @param {IdType} [opts.itemId] - The custom item ID.
12
+ * @return {string} - The generated autosave editor key.
13
+ */
14
+ export declare function generateAutosaveEditorKey<Item>(descriptor: EditorDescriptorInst<Item>, item: Item | undefined, url: string, opts?: {
15
+ editorId?: string;
16
+ itemId?: IdType;
17
+ }): string;
@@ -0,0 +1,10 @@
1
+ export interface EditorAutoSavePreviewModel<Item> {
2
+ saved?: Item;
3
+ original?: Item;
4
+ savedAt?: Date;
5
+ }
6
+ export type EditorAutoSaveStates = 'initial' | 'saved' | 'saving' | 'preview' | 'previewCurrent' | 'restored';
7
+ export interface EditorAutoSaveStatus {
8
+ state: EditorAutoSaveStates;
9
+ timestamp?: Date;
10
+ }
@@ -1,4 +1,4 @@
1
- import { InputSignal, Provider, WritableSignal } from '@angular/core';
1
+ import { InputSignal, InputSignalWithTransform, Provider, WritableSignal } from '@angular/core';
2
2
  import { AbstractControl, FormGroup, UntypedFormGroup } from '@angular/forms';
3
3
  import { FormlyFieldConfig, FormlyFormOptions } from '@ngx-formly/core';
4
4
  import { Message } from 'primeng/api';
@@ -11,7 +11,7 @@ export declare class FormEditorService<Item, ParentItem = any> implements IFormE
11
11
  get parentService(): FormEditorService<ParentItem, any> | undefined;
12
12
  get formComponent(): IFormEditorComponent<Item>;
13
13
  get descriptor(): InputSignal<EditorDescriptorInst<Item>>;
14
- get isFormDisabled(): InputSignal<boolean>;
14
+ get isFormDisabled(): InputSignalWithTransform<boolean, unknown>;
15
15
  get formMessages(): WritableSignal<Message[]>;
16
16
  get form(): FormGroup<{
17
17
  [K in keyof Item]: AbstractControl<Item[K]>;
@@ -22,6 +22,7 @@ export * from './action/services/data-provider-executor.service';
22
22
  export * from './action/services/navigation.service';
23
23
  export * from './action/services/root-action-executor.service';
24
24
  export * from './action/services/view-container.service';
25
+ export * from './editor/components/editor/auto-save-status/auto-save-status.component';
25
26
  export * from './editor/components/editor/form-editor.component';
26
27
  export * from './editor/components/formly/fields/formly-field-action/formly-field-action.component';
27
28
  export * from './editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component';
@@ -41,6 +42,7 @@ export * from './editor/helpers/editor-formly';
41
42
  export * from './editor/helpers/formly-config';
42
43
  export * from './editor/helpers/notification';
43
44
  export * from './editor/helpers/editor-validators';
45
+ export * from './editor/models/editor-auto-save-preview.model';
44
46
  export * from './editor/models/formly-config.model';
45
47
  export * from './editor/services/form-editor.service';
46
48
  export * from './editor/services/formly-config.provider';
package/version-info.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@mediusinc/mng-commons",
3
- "version": "5.4.0-rc.0",
3
+ "version": "5.4.0-rc.1",
4
4
  "tag": "v5.3.0-rc.5",
5
- "distance": 2,
6
- "hash": "e46579b2",
5
+ "distance": 6,
6
+ "hash": "c31e17b3",
7
7
  "dirty": true,
8
- "semver": "5.3.0-rc.5+2.ge46579b2.dirty",
8
+ "semver": "5.3.0-rc.5+6.gc31e17b3.dirty",
9
9
  "buildTimestamp": null,
10
- "raw": "v5.3.0-rc.5-2-e46579b2-dirty"
10
+ "raw": "v5.3.0-rc.5-6-c31e17b3-dirty"
11
11
  }