ngx-form-draft 2.0.5 → 2.1.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.
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ Zero-dependency Angular form draft auto-save and restore. Works with Angular 14+
|
|
|
23
23
|
npm install ngx-form-draft
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
##
|
|
26
|
+
## Setup
|
|
27
27
|
|
|
28
28
|
### 1. Import the module
|
|
29
29
|
|
|
@@ -36,7 +36,9 @@ import { NgxFormDraftModule } from 'ngx-form-draft';
|
|
|
36
36
|
export class AppModule {}
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
## Usage
|
|
40
|
+
|
|
41
|
+
### 1. Add directive to your form
|
|
40
42
|
|
|
41
43
|
```html
|
|
42
44
|
<form [formGroup]="myForm" ngxFormDraft="uniqueFormId">
|
|
@@ -44,7 +46,7 @@ export class AppModule {}
|
|
|
44
46
|
</form>
|
|
45
47
|
```
|
|
46
48
|
|
|
47
|
-
###
|
|
49
|
+
### 2. Scoped drafts (per entity)
|
|
48
50
|
|
|
49
51
|
```html
|
|
50
52
|
<form [formGroup]="editForm" [ngxFormDraft]="'edit_' + userId">
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
|
|
2
|
-
import { trigger, transition, style, animate } from '@angular/animations';
|
|
3
2
|
import * as i0 from "@angular/core";
|
|
4
3
|
import * as i1 from "@angular/common";
|
|
5
4
|
export class FormDraftBannerComponent {
|
|
@@ -16,7 +15,7 @@ export class FormDraftBannerComponent {
|
|
|
16
15
|
}
|
|
17
16
|
FormDraftBannerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FormDraftBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
18
17
|
FormDraftBannerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: FormDraftBannerComponent, selector: "ngx-form-draft-banner", inputs: { visible: "visible", timeLabel: "timeLabel", isRestored: "isRestored", restoredText: "restoredText", savedText: "savedText", savedLabel: "savedLabel", discardText: "discardText" }, outputs: { discard: "discard" }, ngImport: i0, template: `
|
|
19
|
-
<div class="form-draft-banner" *ngIf="visible"
|
|
18
|
+
<div class="form-draft-banner" *ngIf="visible">
|
|
20
19
|
<div class="form-draft-banner__icon">
|
|
21
20
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
22
21
|
<path d="M12 8V12L14.5 14.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
@@ -38,21 +37,11 @@ FormDraftBannerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0
|
|
|
38
37
|
</button>
|
|
39
38
|
</div>
|
|
40
39
|
</div>
|
|
41
|
-
`, isInline: true, styles: [":host{display:block;width:100%}.form-draft-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;margin-bottom:12px;border-radius:8px;background:linear-gradient(135deg,#eef6ff 0%,#f0f4ff 100%);border:1px solid #c5ddf8;box-shadow:0 2px 8px #128ad614}.form-draft-banner__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,#128ad6,#22b9ff);color:#fff;flex-shrink:0}.form-draft-banner__content{flex:1;min-width:0}.form-draft-banner__text{font-size:13px;font-weight:600;color:#1a3a5c}.form-draft-banner__time{font-weight:400;color:#6b8aaa;font-size:12px}.form-draft-banner__actions{flex-shrink:0}.form-draft-banner__btn{border:none;padding:5px 12px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s ease}.form-draft-banner__btn--discard{background:transparent;color:#8899a6;border:1px solid #d0dce6}.form-draft-banner__btn--discard:hover{background:#fef2f2;color:#e62e43;border-color:#e62e43}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }],
|
|
42
|
-
trigger('slideDown', [
|
|
43
|
-
transition(':enter', [
|
|
44
|
-
style({ opacity: 0, transform: 'translateY(-8px)' }),
|
|
45
|
-
animate('250ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 1, transform: 'translateY(0)' }))
|
|
46
|
-
]),
|
|
47
|
-
transition(':leave', [
|
|
48
|
-
animate('200ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 0, transform: 'translateY(-8px)' }))
|
|
49
|
-
])
|
|
50
|
-
])
|
|
51
|
-
], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
40
|
+
`, isInline: true, styles: [":host{display:block;width:100%}.form-draft-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;margin-bottom:12px;border-radius:8px;background:linear-gradient(135deg,#eef6ff 0%,#f0f4ff 100%);border:1px solid #c5ddf8;box-shadow:0 2px 8px #128ad614;animation:slideDown .25s cubic-bezier(.4,0,.2,1)}@keyframes slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.form-draft-banner__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,#128ad6,#22b9ff);color:#fff;flex-shrink:0}.form-draft-banner__content{flex:1;min-width:0}.form-draft-banner__text{font-size:13px;font-weight:600;color:#1a3a5c}.form-draft-banner__time{font-weight:400;color:#6b8aaa;font-size:12px}.form-draft-banner__actions{flex-shrink:0}.form-draft-banner__btn{border:none;padding:5px 12px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s ease}.form-draft-banner__btn--discard{background:transparent;color:#8899a6;border:1px solid #d0dce6}.form-draft-banner__btn--discard:hover{background:#fef2f2;color:#e62e43;border-color:#e62e43}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
52
41
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FormDraftBannerComponent, decorators: [{
|
|
53
42
|
type: Component,
|
|
54
43
|
args: [{ selector: 'ngx-form-draft-banner', template: `
|
|
55
|
-
<div class="form-draft-banner" *ngIf="visible"
|
|
44
|
+
<div class="form-draft-banner" *ngIf="visible">
|
|
56
45
|
<div class="form-draft-banner__icon">
|
|
57
46
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
58
47
|
<path d="M12 8V12L14.5 14.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
@@ -74,17 +63,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
74
63
|
</button>
|
|
75
64
|
</div>
|
|
76
65
|
</div>
|
|
77
|
-
`,
|
|
78
|
-
trigger('slideDown', [
|
|
79
|
-
transition(':enter', [
|
|
80
|
-
style({ opacity: 0, transform: 'translateY(-8px)' }),
|
|
81
|
-
animate('250ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 1, transform: 'translateY(0)' }))
|
|
82
|
-
]),
|
|
83
|
-
transition(':leave', [
|
|
84
|
-
animate('200ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 0, transform: 'translateY(-8px)' }))
|
|
85
|
-
])
|
|
86
|
-
])
|
|
87
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%}.form-draft-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;margin-bottom:12px;border-radius:8px;background:linear-gradient(135deg,#eef6ff 0%,#f0f4ff 100%);border:1px solid #c5ddf8;box-shadow:0 2px 8px #128ad614}.form-draft-banner__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,#128ad6,#22b9ff);color:#fff;flex-shrink:0}.form-draft-banner__content{flex:1;min-width:0}.form-draft-banner__text{font-size:13px;font-weight:600;color:#1a3a5c}.form-draft-banner__time{font-weight:400;color:#6b8aaa;font-size:12px}.form-draft-banner__actions{flex-shrink:0}.form-draft-banner__btn{border:none;padding:5px 12px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s ease}.form-draft-banner__btn--discard{background:transparent;color:#8899a6;border:1px solid #d0dce6}.form-draft-banner__btn--discard:hover{background:#fef2f2;color:#e62e43;border-color:#e62e43}\n"] }]
|
|
66
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%}.form-draft-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;margin-bottom:12px;border-radius:8px;background:linear-gradient(135deg,#eef6ff 0%,#f0f4ff 100%);border:1px solid #c5ddf8;box-shadow:0 2px 8px #128ad614;animation:slideDown .25s cubic-bezier(.4,0,.2,1)}@keyframes slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.form-draft-banner__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,#128ad6,#22b9ff);color:#fff;flex-shrink:0}.form-draft-banner__content{flex:1;min-width:0}.form-draft-banner__text{font-size:13px;font-weight:600;color:#1a3a5c}.form-draft-banner__time{font-weight:400;color:#6b8aaa;font-size:12px}.form-draft-banner__actions{flex-shrink:0}.form-draft-banner__btn{border:none;padding:5px 12px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s ease}.form-draft-banner__btn--discard{background:transparent;color:#8899a6;border:1px solid #d0dce6}.form-draft-banner__btn--discard:hover{background:#fef2f2;color:#e62e43;border-color:#e62e43}\n"] }]
|
|
88
67
|
}], propDecorators: { visible: [{
|
|
89
68
|
type: Input
|
|
90
69
|
}], timeLabel: [{
|
|
@@ -102,4 +81,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
102
81
|
}], discard: [{
|
|
103
82
|
type: Output
|
|
104
83
|
}] } });
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1kcmFmdC1iYW5uZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Zvcm0tZHJhZnQtYmFubmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUF5RGhHLE1BQU0sT0FBTyx3QkFBd0I7SUF2RHJDO1FBd0RXLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNmLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsaUJBQVksR0FBRyxnQkFBZ0IsQ0FBQztRQUNoQyxjQUFTLEdBQUcsYUFBYSxDQUFDO1FBQzFCLGVBQVUsR0FBRyxPQUFPLENBQUM7UUFDckIsZ0JBQVcsR0FBRyxTQUFTLENBQUM7UUFDdkIsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0FDOUM7O3FIQVRZLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLDRSQXJEekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJUOzJGQThCVSx3QkFBd0I7a0JBdkRwQyxTQUFTOytCQUNFLHVCQUF1QixZQUN2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1QlQsbUJBNEJnQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUd0QyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksT0FBTztzQkFBaEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZm9ybS1kcmFmdC1iYW5uZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWRyYWZ0LWJhbm5lclwiICpuZ0lmPVwidmlzaWJsZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZHJhZnQtYmFubmVyX19pY29uXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgOFYxMkwxNC41IDE0LjVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiOVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1kcmFmdC1iYW5uZXJfX2NvbnRlbnRcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLWRyYWZ0LWJhbm5lcl9fdGV4dFwiPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaXNSZXN0b3JlZFwiPnt7IHJlc3RvcmVkVGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc1Jlc3RvcmVkXCI+e3sgc2F2ZWRUZXh0IH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1kcmFmdC1iYW5uZXJfX3RpbWVcIiAqbmdJZj1cInRpbWVMYWJlbCAmJiBpc1Jlc3RvcmVkXCI+XG4gICAgICAgICAgICAmbWlkZG90OyB7eyBzYXZlZExhYmVsIH19IHt7IHRpbWVMYWJlbCB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1kcmFmdC1iYW5uZXJfX2FjdGlvbnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImZvcm0tZHJhZnQtYmFubmVyX19idG4gZm9ybS1kcmFmdC1iYW5uZXJfX2J0bi0tZGlzY2FyZFwiIChjbGljayk9XCJkaXNjYXJkLmVtaXQoKVwiIHR5cGU9XCJidXR0b25cIj5cbiAgICAgICAgICDinJUge3sgZGlzY2FyZFRleHQgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyB9XG4gICAgLmZvcm0tZHJhZnQtYmFubmVyIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsgcGFkZGluZzogMTBweCAxNHB4OyBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZWVmNmZmIDAlLCAjZjBmNGZmIDEwMCUpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2M1ZGRmODsgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMTgsIDEzOCwgMjE0LCAwLjA4KTtcbiAgICAgIGFuaW1hdGlvbjogc2xpZGVEb3duIDI1MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7XG4gICAgfVxuICAgIEBrZXlmcmFtZXMgc2xpZGVEb3duIHtcbiAgICAgIGZyb20geyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLThweCk7IH1cbiAgICAgIHRvIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XG4gICAgfVxuICAgIC5mb3JtLWRyYWZ0LWJhbm5lcl9faWNvbiB7XG4gICAgICBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgd2lkdGg6IDMycHg7IGhlaWdodDogMzJweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzEyOGFkNiwgIzIyYjlmZik7IGNvbG9yOiAjZmZmOyBmbGV4LXNocmluazogMDtcbiAgICB9XG4gICAgLmZvcm0tZHJhZnQtYmFubmVyX19jb250ZW50IHsgZmxleDogMTsgbWluLXdpZHRoOiAwOyB9XG4gICAgLmZvcm0tZHJhZnQtYmFubmVyX190ZXh0IHsgZm9udC1zaXplOiAxM3B4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzFhM2E1YzsgfVxuICAgIC5mb3JtLWRyYWZ0LWJhbm5lcl9fdGltZSB7IGZvbnQtd2VpZ2h0OiA0MDA7IGNvbG9yOiAjNmI4YWFhOyBmb250LXNpemU6IDEycHg7IH1cbiAgICAuZm9ybS1kcmFmdC1iYW5uZXJfX2FjdGlvbnMgeyBmbGV4LXNocmluazogMDsgfVxuICAgIC5mb3JtLWRyYWZ0LWJhbm5lcl9fYnRuIHtcbiAgICAgIGJvcmRlcjogbm9uZTsgcGFkZGluZzogNXB4IDEycHg7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAxMnB4O1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyOyB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xuICAgIH1cbiAgICAuZm9ybS1kcmFmdC1iYW5uZXJfX2J0bi0tZGlzY2FyZCB7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogIzg4OTlhNjsgYm9yZGVyOiAxcHggc29saWQgI2QwZGNlNjsgfVxuICAgIC5mb3JtLWRyYWZ0LWJhbm5lcl9fYnRuLS1kaXNjYXJkOmhvdmVyIHsgYmFja2dyb3VuZDogI2ZlZjJmMjsgY29sb3I6ICNlNjJlNDM7IGJvcmRlci1jb2xvcjogI2U2MmU0MzsgfVxuICBgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1EcmFmdEJhbm5lckNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHZpc2libGUgPSBmYWxzZTtcbiAgQElucHV0KCkgdGltZUxhYmVsID0gJyc7XG4gIEBJbnB1dCgpIGlzUmVzdG9yZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgcmVzdG9yZWRUZXh0ID0gJ0RyYWZ0IHJlc3RvcmVkJztcbiAgQElucHV0KCkgc2F2ZWRUZXh0ID0gJ0RyYWZ0IHNhdmVkJztcbiAgQElucHV0KCkgc2F2ZWRMYWJlbCA9ICdzYXZlZCc7XG4gIEBJbnB1dCgpIGRpc2NhcmRUZXh0ID0gJ0Rpc2NhcmQnO1xuICBAT3V0cHV0KCkgZGlzY2FyZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbn1cbiJdfQ==
|
|
@@ -4,7 +4,6 @@ import * as i1$1 from '@angular/forms';
|
|
|
4
4
|
import { FormGroup, FormArray, FormControl } from '@angular/forms';
|
|
5
5
|
import { Subject } from 'rxjs';
|
|
6
6
|
import { debounceTime, takeUntil } from 'rxjs/operators';
|
|
7
|
-
import { trigger, transition, style, animate } from '@angular/animations';
|
|
8
7
|
import * as i1 from '@angular/common';
|
|
9
8
|
import { CommonModule } from '@angular/common';
|
|
10
9
|
|
|
@@ -22,7 +21,7 @@ class FormDraftBannerComponent {
|
|
|
22
21
|
}
|
|
23
22
|
FormDraftBannerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FormDraftBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
24
23
|
FormDraftBannerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: FormDraftBannerComponent, selector: "ngx-form-draft-banner", inputs: { visible: "visible", timeLabel: "timeLabel", isRestored: "isRestored", restoredText: "restoredText", savedText: "savedText", savedLabel: "savedLabel", discardText: "discardText" }, outputs: { discard: "discard" }, ngImport: i0, template: `
|
|
25
|
-
<div class="form-draft-banner" *ngIf="visible"
|
|
24
|
+
<div class="form-draft-banner" *ngIf="visible">
|
|
26
25
|
<div class="form-draft-banner__icon">
|
|
27
26
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
28
27
|
<path d="M12 8V12L14.5 14.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
@@ -44,21 +43,11 @@ FormDraftBannerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0
|
|
|
44
43
|
</button>
|
|
45
44
|
</div>
|
|
46
45
|
</div>
|
|
47
|
-
`, isInline: true, styles: [":host{display:block;width:100%}.form-draft-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;margin-bottom:12px;border-radius:8px;background:linear-gradient(135deg,#eef6ff 0%,#f0f4ff 100%);border:1px solid #c5ddf8;box-shadow:0 2px 8px #128ad614}.form-draft-banner__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,#128ad6,#22b9ff);color:#fff;flex-shrink:0}.form-draft-banner__content{flex:1;min-width:0}.form-draft-banner__text{font-size:13px;font-weight:600;color:#1a3a5c}.form-draft-banner__time{font-weight:400;color:#6b8aaa;font-size:12px}.form-draft-banner__actions{flex-shrink:0}.form-draft-banner__btn{border:none;padding:5px 12px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s ease}.form-draft-banner__btn--discard{background:transparent;color:#8899a6;border:1px solid #d0dce6}.form-draft-banner__btn--discard:hover{background:#fef2f2;color:#e62e43;border-color:#e62e43}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }],
|
|
48
|
-
trigger('slideDown', [
|
|
49
|
-
transition(':enter', [
|
|
50
|
-
style({ opacity: 0, transform: 'translateY(-8px)' }),
|
|
51
|
-
animate('250ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 1, transform: 'translateY(0)' }))
|
|
52
|
-
]),
|
|
53
|
-
transition(':leave', [
|
|
54
|
-
animate('200ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 0, transform: 'translateY(-8px)' }))
|
|
55
|
-
])
|
|
56
|
-
])
|
|
57
|
-
], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
46
|
+
`, isInline: true, styles: [":host{display:block;width:100%}.form-draft-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;margin-bottom:12px;border-radius:8px;background:linear-gradient(135deg,#eef6ff 0%,#f0f4ff 100%);border:1px solid #c5ddf8;box-shadow:0 2px 8px #128ad614;animation:slideDown .25s cubic-bezier(.4,0,.2,1)}@keyframes slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.form-draft-banner__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,#128ad6,#22b9ff);color:#fff;flex-shrink:0}.form-draft-banner__content{flex:1;min-width:0}.form-draft-banner__text{font-size:13px;font-weight:600;color:#1a3a5c}.form-draft-banner__time{font-weight:400;color:#6b8aaa;font-size:12px}.form-draft-banner__actions{flex-shrink:0}.form-draft-banner__btn{border:none;padding:5px 12px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s ease}.form-draft-banner__btn--discard{background:transparent;color:#8899a6;border:1px solid #d0dce6}.form-draft-banner__btn--discard:hover{background:#fef2f2;color:#e62e43;border-color:#e62e43}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
58
47
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FormDraftBannerComponent, decorators: [{
|
|
59
48
|
type: Component,
|
|
60
49
|
args: [{ selector: 'ngx-form-draft-banner', template: `
|
|
61
|
-
<div class="form-draft-banner" *ngIf="visible"
|
|
50
|
+
<div class="form-draft-banner" *ngIf="visible">
|
|
62
51
|
<div class="form-draft-banner__icon">
|
|
63
52
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
64
53
|
<path d="M12 8V12L14.5 14.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
@@ -80,17 +69,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
80
69
|
</button>
|
|
81
70
|
</div>
|
|
82
71
|
</div>
|
|
83
|
-
`,
|
|
84
|
-
trigger('slideDown', [
|
|
85
|
-
transition(':enter', [
|
|
86
|
-
style({ opacity: 0, transform: 'translateY(-8px)' }),
|
|
87
|
-
animate('250ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 1, transform: 'translateY(0)' }))
|
|
88
|
-
]),
|
|
89
|
-
transition(':leave', [
|
|
90
|
-
animate('200ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 0, transform: 'translateY(-8px)' }))
|
|
91
|
-
])
|
|
92
|
-
])
|
|
93
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%}.form-draft-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;margin-bottom:12px;border-radius:8px;background:linear-gradient(135deg,#eef6ff 0%,#f0f4ff 100%);border:1px solid #c5ddf8;box-shadow:0 2px 8px #128ad614}.form-draft-banner__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,#128ad6,#22b9ff);color:#fff;flex-shrink:0}.form-draft-banner__content{flex:1;min-width:0}.form-draft-banner__text{font-size:13px;font-weight:600;color:#1a3a5c}.form-draft-banner__time{font-weight:400;color:#6b8aaa;font-size:12px}.form-draft-banner__actions{flex-shrink:0}.form-draft-banner__btn{border:none;padding:5px 12px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s ease}.form-draft-banner__btn--discard{background:transparent;color:#8899a6;border:1px solid #d0dce6}.form-draft-banner__btn--discard:hover{background:#fef2f2;color:#e62e43;border-color:#e62e43}\n"] }]
|
|
72
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%}.form-draft-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;margin-bottom:12px;border-radius:8px;background:linear-gradient(135deg,#eef6ff 0%,#f0f4ff 100%);border:1px solid #c5ddf8;box-shadow:0 2px 8px #128ad614;animation:slideDown .25s cubic-bezier(.4,0,.2,1)}@keyframes slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.form-draft-banner__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,#128ad6,#22b9ff);color:#fff;flex-shrink:0}.form-draft-banner__content{flex:1;min-width:0}.form-draft-banner__text{font-size:13px;font-weight:600;color:#1a3a5c}.form-draft-banner__time{font-weight:400;color:#6b8aaa;font-size:12px}.form-draft-banner__actions{flex-shrink:0}.form-draft-banner__btn{border:none;padding:5px 12px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s ease}.form-draft-banner__btn--discard{background:transparent;color:#8899a6;border:1px solid #d0dce6}.form-draft-banner__btn--discard:hover{background:#fef2f2;color:#e62e43;border-color:#e62e43}\n"] }]
|
|
94
73
|
}], propDecorators: { visible: [{
|
|
95
74
|
type: Input
|
|
96
75
|
}], timeLabel: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-form-draft.mjs","sources":["../../src/form-draft-banner.component.ts","../../src/form-draft.service.ts","../../src/form-draft.directive.ts","../../src/ngx-form-draft.module.ts","../../src/ngx-form-draft.ts"],"sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\n\n@Component({\n selector: 'ngx-form-draft-banner',\n template: `\n <div class=\"form-draft-banner\" *ngIf=\"visible\" [@slideDown]>\n <div class=\"form-draft-banner__icon\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 8V12L14.5 14.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n </div>\n <div class=\"form-draft-banner__content\">\n <span class=\"form-draft-banner__text\">\n <span *ngIf=\"isRestored\">{{ restoredText }}</span>\n <span *ngIf=\"!isRestored\">{{ savedText }}</span>\n <span class=\"form-draft-banner__time\" *ngIf=\"timeLabel && isRestored\">\n · {{ savedLabel }} {{ timeLabel }}\n </span>\n </span>\n </div>\n <div class=\"form-draft-banner__actions\">\n <button class=\"form-draft-banner__btn form-draft-banner__btn--discard\" (click)=\"discard.emit()\" type=\"button\">\n ✕ {{ discardText }}\n </button>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; width: 100%; }\n .form-draft-banner {\n display: flex; align-items: center; gap: 10px; padding: 10px 14px; margin-bottom: 12px;\n border-radius: 8px; background: linear-gradient(135deg, #eef6ff 0%, #f0f4ff 100%);\n border: 1px solid #c5ddf8; box-shadow: 0 2px 8px rgba(18, 138, 214, 0.08);\n }\n .form-draft-banner__icon {\n display: flex; align-items: center; justify-content: center; width: 32px; height: 32px;\n border-radius: 6px; background: linear-gradient(135deg, #128ad6, #22b9ff); color: #fff; flex-shrink: 0;\n }\n .form-draft-banner__content { flex: 1; min-width: 0; }\n .form-draft-banner__text { font-size: 13px; font-weight: 600; color: #1a3a5c; }\n .form-draft-banner__time { font-weight: 400; color: #6b8aaa; font-size: 12px; }\n .form-draft-banner__actions { flex-shrink: 0; }\n .form-draft-banner__btn {\n border: none; padding: 5px 12px; border-radius: 6px; font-size: 12px;\n font-weight: 600; cursor: pointer; transition: all 0.2s ease;\n }\n .form-draft-banner__btn--discard { background: transparent; color: #8899a6; border: 1px solid #d0dce6; }\n .form-draft-banner__btn--discard:hover { background: #fef2f2; color: #e62e43; border-color: #e62e43; }\n `],\n animations: [\n trigger('slideDown', [\n transition(':enter', [\n style({ opacity: 0, transform: 'translateY(-8px)' }),\n animate('250ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 1, transform: 'translateY(0)' }))\n ]),\n transition(':leave', [\n animate('200ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 0, transform: 'translateY(-8px)' }))\n ])\n ])\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormDraftBannerComponent {\n @Input() visible = false;\n @Input() timeLabel = '';\n @Input() isRestored = false;\n @Input() restoredText = 'Draft restored';\n @Input() savedText = 'Draft saved';\n @Input() savedLabel = 'saved';\n @Input() discardText = 'Discard';\n @Output() discard = new EventEmitter<void>();\n}\n","import { Injectable } from '@angular/core';\n\nexport interface FormDraftData {\n values: Record<string, any>;\n savedAt: number;\n formId: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FormDraftService {\n private readonly STORAGE_PREFIX = 'form_draft_';\n private readonly MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\n private buildKey(formId: string): string {\n return `${this.STORAGE_PREFIX}${formId}`;\n }\n\n save(formId: string, values: Record<string, any>): void {\n try {\n const draft: FormDraftData = { values, savedAt: Date.now(), formId };\n localStorage.setItem(this.buildKey(formId), JSON.stringify(draft));\n } catch (e) {\n console.warn('[FormDraft] Could not save draft:', e);\n }\n }\n\n load(formId: string): FormDraftData | null {\n try {\n const raw = localStorage.getItem(this.buildKey(formId));\n if (!raw) return null;\n\n const draft: FormDraftData = JSON.parse(raw);\n if (Date.now() - draft.savedAt > this.MAX_AGE_MS) {\n this.clear(formId);\n return null;\n }\n return draft;\n } catch (e) {\n console.warn('[FormDraft] Could not load draft:', e);\n return null;\n }\n }\n\n clear(formId: string): void {\n try {\n localStorage.removeItem(this.buildKey(formId));\n } catch (e) {\n console.warn('[FormDraft] Could not clear draft:', e);\n }\n }\n\n formatTimestamp(timestamp: number): string {\n const seconds = Math.floor((Date.now() - timestamp) / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n }\n}\n","import {\n Directive, Input, OnInit, OnDestroy, Optional, ComponentRef,\n ViewContainerRef, ChangeDetectorRef, ElementRef, Renderer2,\n} from '@angular/core';\nimport { NgForm, FormGroupDirective, AbstractControl, FormArray, FormGroup, FormControl } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { FormDraftService } from './form-draft.service';\nimport { FormDraftBannerComponent } from './form-draft-banner.component';\n\n/**\n * Auto-saves and restores form drafts\n * \n * @example\n * <form [formGroup]=\"myForm\" ngxFormDraft=\"myFormId\">\n * \n * @example\n * <form [formGroup]=\"myForm\" [ngxFormDraft]=\"'edit_' + entityId\" [draftExcludeFields]=\"['password']\">\n */\n@Directive({\n selector: '[ngxFormDraft]',\n})\nexport class FormDraftDirective implements OnInit, OnDestroy {\n @Input('ngxFormDraft') formId!: string;\n @Input() draftDebounce = 800;\n @Input() draftExcludeFields: string[] = [];\n @Input() draftShowOnChange = false;\n @Input() draftRestoredText = 'Draft restored';\n @Input() draftSavedText = 'Draft saved';\n @Input() draftSavedLabel = 'saved';\n @Input() draftDiscardText = 'Discard';\n\n private destroy$ = new Subject<void>();\n private bannerRef: ComponentRef<FormDraftBannerComponent> | null = null;\n private formControl: AbstractControl | null = null;\n private initialValues: Record<string, any> = {};\n private isRestoring = false;\n\n constructor(\n @Optional() private formGroupDir: FormGroupDirective,\n @Optional() private ngForm: NgForm,\n private draftService: FormDraftService,\n private viewContainerRef: ViewContainerRef,\n private cdRef: ChangeDetectorRef,\n private elRef: ElementRef,\n private renderer: Renderer2,\n ) {}\n\n ngOnInit(): void {\n this.formControl = this.formGroupDir?.form || this.ngForm?.form || null;\n if (!this.formControl || !this.formId) return;\n\n this.initialValues = JSON.parse(JSON.stringify(this.formControl.value));\n\n const draft = this.draftService.load(this.formId);\n if (draft) {\n this.restoreDraft(draft.values);\n this.showBanner(draft.savedAt, true);\n }\n\n this.formControl.valueChanges\n .pipe(debounceTime(this.draftDebounce), takeUntil(this.destroy$))\n .subscribe((values) => {\n if (this.isRestoring) return;\n this.saveDraft(values);\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.destroyBanner();\n }\n\n private saveDraft(values: Record<string, any>): void {\n const filtered = this.filterFields(values);\n \n if (this.isAllEmpty(filtered) || this.matchesInitialValues(filtered)) {\n return;\n }\n\n this.draftService.save(this.formId, filtered);\n if (this.draftShowOnChange && !this.bannerRef) {\n this.showBanner(Date.now(), false);\n }\n }\n\n private filterFields(values: Record<string, any>): Record<string, any> {\n if (!this.draftExcludeFields.length) return values;\n const result = { ...values };\n this.draftExcludeFields.forEach(field => delete result[field]);\n return result;\n }\n\n private isAllEmpty(values: Record<string, any>): boolean {\n return Object.values(values).every(\n v => v === null || v === undefined || v === '' || (Array.isArray(v) && v.length === 0)\n );\n }\n\n private matchesInitialValues(values: Record<string, any>): boolean {\n return JSON.stringify(values) === JSON.stringify(this.initialValues);\n }\n\n private restoreDraft(values: Record<string, any>): void {\n if (!this.formControl) return;\n this.isRestoring = true;\n\n const form = this.formGroupDir?.form || this.ngForm?.form;\n if (form) {\n this.prepareFormArrays(form, values);\n form.patchValue(values);\n }\n\n setTimeout(() => this.isRestoring = false, 100);\n }\n\n private prepareFormArrays(control: AbstractControl, value: any): void {\n if (!control || value == null) return;\n\n if (control instanceof FormGroup && value && typeof value === 'object' && !Array.isArray(value)) {\n Object.keys(value).forEach(key => {\n const childControl = control.get(key);\n if (childControl) this.prepareFormArrays(childControl, value[key]);\n });\n return;\n }\n\n if (control instanceof FormArray && Array.isArray(value)) {\n const formArray = control as FormArray;\n\n while (formArray.length < value.length) {\n const template = formArray.at(0);\n if (template instanceof FormGroup) {\n const newGroup = new FormGroup({});\n Object.keys(template.controls).forEach(ctrlName => {\n const existing = template.get(ctrlName) as AbstractControl;\n if (existing instanceof FormArray) {\n newGroup.addControl(ctrlName, new FormArray([]));\n } else if (existing instanceof FormGroup) {\n newGroup.addControl(ctrlName, new FormGroup({}));\n } else {\n newGroup.addControl(ctrlName, new FormControl(null));\n }\n });\n formArray.push(newGroup);\n } else if (template) {\n formArray.push(new FormControl(null));\n } else {\n const firstValue = value[0];\n if (firstValue && typeof firstValue === 'object' && !Array.isArray(firstValue)) {\n const group = new FormGroup({});\n Object.keys(firstValue).forEach(key => group.addControl(key, new FormControl(null)));\n formArray.push(group);\n } else {\n formArray.push(new FormControl(null));\n }\n }\n }\n\n while (formArray.length > value.length) {\n formArray.removeAt(formArray.length - 1);\n }\n\n value.forEach((childValue, index) => {\n this.prepareFormArrays(formArray.at(index), childValue);\n });\n }\n }\n\n private discardDraft(): void {\n this.draftService.clear(this.formId);\n\n if (this.formControl) {\n this.isRestoring = true;\n const form = this.formGroupDir?.form || this.ngForm?.form;\n if (form) {\n this.prepareFormArrays(form, this.initialValues);\n form.reset(this.initialValues);\n }\n setTimeout(() => {\n this.isRestoring = false;\n }, this.draftDebounce + 200);\n }\n\n this.destroyBanner();\n }\n\n private showBanner(savedAt: number, isRestored = false): void {\n this.bannerRef = this.viewContainerRef.createComponent(FormDraftBannerComponent);\n this.bannerRef.setInput('visible', true);\n this.bannerRef.setInput('isRestored', isRestored);\n this.bannerRef.setInput('timeLabel', isRestored ? this.draftService.formatTimestamp(savedAt) : '');\n this.bannerRef.setInput('restoredText', this.draftRestoredText);\n this.bannerRef.setInput('savedText', this.draftSavedText);\n this.bannerRef.setInput('savedLabel', this.draftSavedLabel);\n this.bannerRef.setInput('discardText', this.draftDiscardText);\n\n this.bannerRef.instance.discard.subscribe(() => this.discardDraft());\n\n const bannerEl = this.bannerRef.location.nativeElement;\n const formEl = this.elRef.nativeElement;\n this.renderer.insertBefore(formEl, bannerEl, formEl.firstChild);\n\n this.cdRef.detectChanges();\n }\n\n private destroyBanner(): void {\n if (this.bannerRef) {\n this.bannerRef.destroy();\n this.bannerRef = null;\n }\n }\n\n public clearDraft(): void {\n this.draftService.clear(this.formId);\n this.destroyBanner();\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormDraftDirective } from './form-draft.directive';\nimport { FormDraftBannerComponent } from './form-draft-banner.component';\n\n@NgModule({\n declarations: [FormDraftDirective, FormDraftBannerComponent],\n imports: [CommonModule],\n exports: [FormDraftDirective, FormDraftBannerComponent],\n})\nexport class NgxFormDraftModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2.FormDraftService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-form-draft.mjs","sources":["../../src/form-draft-banner.component.ts","../../src/form-draft.service.ts","../../src/form-draft.directive.ts","../../src/ngx-form-draft.module.ts","../../src/ngx-form-draft.ts"],"sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'ngx-form-draft-banner',\n template: `\n <div class=\"form-draft-banner\" *ngIf=\"visible\">\n <div class=\"form-draft-banner__icon\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 8V12L14.5 14.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n </div>\n <div class=\"form-draft-banner__content\">\n <span class=\"form-draft-banner__text\">\n <span *ngIf=\"isRestored\">{{ restoredText }}</span>\n <span *ngIf=\"!isRestored\">{{ savedText }}</span>\n <span class=\"form-draft-banner__time\" *ngIf=\"timeLabel && isRestored\">\n · {{ savedLabel }} {{ timeLabel }}\n </span>\n </span>\n </div>\n <div class=\"form-draft-banner__actions\">\n <button class=\"form-draft-banner__btn form-draft-banner__btn--discard\" (click)=\"discard.emit()\" type=\"button\">\n ✕ {{ discardText }}\n </button>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; width: 100%; }\n .form-draft-banner {\n display: flex; align-items: center; gap: 10px; padding: 10px 14px; margin-bottom: 12px;\n border-radius: 8px; background: linear-gradient(135deg, #eef6ff 0%, #f0f4ff 100%);\n border: 1px solid #c5ddf8; box-shadow: 0 2px 8px rgba(18, 138, 214, 0.08);\n animation: slideDown 250ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n @keyframes slideDown {\n from { opacity: 0; transform: translateY(-8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n .form-draft-banner__icon {\n display: flex; align-items: center; justify-content: center; width: 32px; height: 32px;\n border-radius: 6px; background: linear-gradient(135deg, #128ad6, #22b9ff); color: #fff; flex-shrink: 0;\n }\n .form-draft-banner__content { flex: 1; min-width: 0; }\n .form-draft-banner__text { font-size: 13px; font-weight: 600; color: #1a3a5c; }\n .form-draft-banner__time { font-weight: 400; color: #6b8aaa; font-size: 12px; }\n .form-draft-banner__actions { flex-shrink: 0; }\n .form-draft-banner__btn {\n border: none; padding: 5px 12px; border-radius: 6px; font-size: 12px;\n font-weight: 600; cursor: pointer; transition: all 0.2s ease;\n }\n .form-draft-banner__btn--discard { background: transparent; color: #8899a6; border: 1px solid #d0dce6; }\n .form-draft-banner__btn--discard:hover { background: #fef2f2; color: #e62e43; border-color: #e62e43; }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormDraftBannerComponent {\n @Input() visible = false;\n @Input() timeLabel = '';\n @Input() isRestored = false;\n @Input() restoredText = 'Draft restored';\n @Input() savedText = 'Draft saved';\n @Input() savedLabel = 'saved';\n @Input() discardText = 'Discard';\n @Output() discard = new EventEmitter<void>();\n}\n","import { Injectable } from '@angular/core';\n\nexport interface FormDraftData {\n values: Record<string, any>;\n savedAt: number;\n formId: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FormDraftService {\n private readonly STORAGE_PREFIX = 'form_draft_';\n private readonly MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\n private buildKey(formId: string): string {\n return `${this.STORAGE_PREFIX}${formId}`;\n }\n\n save(formId: string, values: Record<string, any>): void {\n try {\n const draft: FormDraftData = { values, savedAt: Date.now(), formId };\n localStorage.setItem(this.buildKey(formId), JSON.stringify(draft));\n } catch (e) {\n console.warn('[FormDraft] Could not save draft:', e);\n }\n }\n\n load(formId: string): FormDraftData | null {\n try {\n const raw = localStorage.getItem(this.buildKey(formId));\n if (!raw) return null;\n\n const draft: FormDraftData = JSON.parse(raw);\n if (Date.now() - draft.savedAt > this.MAX_AGE_MS) {\n this.clear(formId);\n return null;\n }\n return draft;\n } catch (e) {\n console.warn('[FormDraft] Could not load draft:', e);\n return null;\n }\n }\n\n clear(formId: string): void {\n try {\n localStorage.removeItem(this.buildKey(formId));\n } catch (e) {\n console.warn('[FormDraft] Could not clear draft:', e);\n }\n }\n\n formatTimestamp(timestamp: number): string {\n const seconds = Math.floor((Date.now() - timestamp) / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n }\n}\n","import {\n Directive, Input, OnInit, OnDestroy, Optional, ComponentRef,\n ViewContainerRef, ChangeDetectorRef, ElementRef, Renderer2,\n} from '@angular/core';\nimport { NgForm, FormGroupDirective, AbstractControl, FormArray, FormGroup, FormControl } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { FormDraftService } from './form-draft.service';\nimport { FormDraftBannerComponent } from './form-draft-banner.component';\n\n/**\n * Auto-saves and restores form drafts\n * \n * @example\n * <form [formGroup]=\"myForm\" ngxFormDraft=\"myFormId\">\n * \n * @example\n * <form [formGroup]=\"myForm\" [ngxFormDraft]=\"'edit_' + entityId\" [draftExcludeFields]=\"['password']\">\n */\n@Directive({\n selector: '[ngxFormDraft]',\n})\nexport class FormDraftDirective implements OnInit, OnDestroy {\n @Input('ngxFormDraft') formId!: string;\n @Input() draftDebounce = 800;\n @Input() draftExcludeFields: string[] = [];\n @Input() draftShowOnChange = false;\n @Input() draftRestoredText = 'Draft restored';\n @Input() draftSavedText = 'Draft saved';\n @Input() draftSavedLabel = 'saved';\n @Input() draftDiscardText = 'Discard';\n\n private destroy$ = new Subject<void>();\n private bannerRef: ComponentRef<FormDraftBannerComponent> | null = null;\n private formControl: AbstractControl | null = null;\n private initialValues: Record<string, any> = {};\n private isRestoring = false;\n\n constructor(\n @Optional() private formGroupDir: FormGroupDirective,\n @Optional() private ngForm: NgForm,\n private draftService: FormDraftService,\n private viewContainerRef: ViewContainerRef,\n private cdRef: ChangeDetectorRef,\n private elRef: ElementRef,\n private renderer: Renderer2,\n ) {}\n\n ngOnInit(): void {\n this.formControl = this.formGroupDir?.form || this.ngForm?.form || null;\n if (!this.formControl || !this.formId) return;\n\n this.initialValues = JSON.parse(JSON.stringify(this.formControl.value));\n\n const draft = this.draftService.load(this.formId);\n if (draft) {\n this.restoreDraft(draft.values);\n this.showBanner(draft.savedAt, true);\n }\n\n this.formControl.valueChanges\n .pipe(debounceTime(this.draftDebounce), takeUntil(this.destroy$))\n .subscribe((values) => {\n if (this.isRestoring) return;\n this.saveDraft(values);\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.destroyBanner();\n }\n\n private saveDraft(values: Record<string, any>): void {\n const filtered = this.filterFields(values);\n \n if (this.isAllEmpty(filtered) || this.matchesInitialValues(filtered)) {\n return;\n }\n\n this.draftService.save(this.formId, filtered);\n if (this.draftShowOnChange && !this.bannerRef) {\n this.showBanner(Date.now(), false);\n }\n }\n\n private filterFields(values: Record<string, any>): Record<string, any> {\n if (!this.draftExcludeFields.length) return values;\n const result = { ...values };\n this.draftExcludeFields.forEach(field => delete result[field]);\n return result;\n }\n\n private isAllEmpty(values: Record<string, any>): boolean {\n return Object.values(values).every(\n v => v === null || v === undefined || v === '' || (Array.isArray(v) && v.length === 0)\n );\n }\n\n private matchesInitialValues(values: Record<string, any>): boolean {\n return JSON.stringify(values) === JSON.stringify(this.initialValues);\n }\n\n private restoreDraft(values: Record<string, any>): void {\n if (!this.formControl) return;\n this.isRestoring = true;\n\n const form = this.formGroupDir?.form || this.ngForm?.form;\n if (form) {\n this.prepareFormArrays(form, values);\n form.patchValue(values);\n }\n\n setTimeout(() => this.isRestoring = false, 100);\n }\n\n private prepareFormArrays(control: AbstractControl, value: any): void {\n if (!control || value == null) return;\n\n if (control instanceof FormGroup && value && typeof value === 'object' && !Array.isArray(value)) {\n Object.keys(value).forEach(key => {\n const childControl = control.get(key);\n if (childControl) this.prepareFormArrays(childControl, value[key]);\n });\n return;\n }\n\n if (control instanceof FormArray && Array.isArray(value)) {\n const formArray = control as FormArray;\n\n while (formArray.length < value.length) {\n const template = formArray.at(0);\n if (template instanceof FormGroup) {\n const newGroup = new FormGroup({});\n Object.keys(template.controls).forEach(ctrlName => {\n const existing = template.get(ctrlName) as AbstractControl;\n if (existing instanceof FormArray) {\n newGroup.addControl(ctrlName, new FormArray([]));\n } else if (existing instanceof FormGroup) {\n newGroup.addControl(ctrlName, new FormGroup({}));\n } else {\n newGroup.addControl(ctrlName, new FormControl(null));\n }\n });\n formArray.push(newGroup);\n } else if (template) {\n formArray.push(new FormControl(null));\n } else {\n const firstValue = value[0];\n if (firstValue && typeof firstValue === 'object' && !Array.isArray(firstValue)) {\n const group = new FormGroup({});\n Object.keys(firstValue).forEach(key => group.addControl(key, new FormControl(null)));\n formArray.push(group);\n } else {\n formArray.push(new FormControl(null));\n }\n }\n }\n\n while (formArray.length > value.length) {\n formArray.removeAt(formArray.length - 1);\n }\n\n value.forEach((childValue, index) => {\n this.prepareFormArrays(formArray.at(index), childValue);\n });\n }\n }\n\n private discardDraft(): void {\n this.draftService.clear(this.formId);\n\n if (this.formControl) {\n this.isRestoring = true;\n const form = this.formGroupDir?.form || this.ngForm?.form;\n if (form) {\n this.prepareFormArrays(form, this.initialValues);\n form.reset(this.initialValues);\n }\n setTimeout(() => {\n this.isRestoring = false;\n }, this.draftDebounce + 200);\n }\n\n this.destroyBanner();\n }\n\n private showBanner(savedAt: number, isRestored = false): void {\n this.bannerRef = this.viewContainerRef.createComponent(FormDraftBannerComponent);\n this.bannerRef.setInput('visible', true);\n this.bannerRef.setInput('isRestored', isRestored);\n this.bannerRef.setInput('timeLabel', isRestored ? this.draftService.formatTimestamp(savedAt) : '');\n this.bannerRef.setInput('restoredText', this.draftRestoredText);\n this.bannerRef.setInput('savedText', this.draftSavedText);\n this.bannerRef.setInput('savedLabel', this.draftSavedLabel);\n this.bannerRef.setInput('discardText', this.draftDiscardText);\n\n this.bannerRef.instance.discard.subscribe(() => this.discardDraft());\n\n const bannerEl = this.bannerRef.location.nativeElement;\n const formEl = this.elRef.nativeElement;\n this.renderer.insertBefore(formEl, bannerEl, formEl.firstChild);\n\n this.cdRef.detectChanges();\n }\n\n private destroyBanner(): void {\n if (this.bannerRef) {\n this.bannerRef.destroy();\n this.bannerRef = null;\n }\n }\n\n public clearDraft(): void {\n this.draftService.clear(this.formId);\n this.destroyBanner();\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormDraftDirective } from './form-draft.directive';\nimport { FormDraftBannerComponent } from './form-draft-banner.component';\n\n@NgModule({\n declarations: [FormDraftDirective, FormDraftBannerComponent],\n imports: [CommonModule],\n exports: [FormDraftDirective, FormDraftBannerComponent],\n})\nexport class NgxFormDraftModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2.FormDraftService"],"mappings":"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"}
|
|
@@ -4,7 +4,6 @@ import * as i1$1 from '@angular/forms';
|
|
|
4
4
|
import { FormGroup, FormArray, FormControl } from '@angular/forms';
|
|
5
5
|
import { Subject } from 'rxjs';
|
|
6
6
|
import { debounceTime, takeUntil } from 'rxjs/operators';
|
|
7
|
-
import { trigger, transition, style, animate } from '@angular/animations';
|
|
8
7
|
import * as i1 from '@angular/common';
|
|
9
8
|
import { CommonModule } from '@angular/common';
|
|
10
9
|
|
|
@@ -22,7 +21,7 @@ class FormDraftBannerComponent {
|
|
|
22
21
|
}
|
|
23
22
|
FormDraftBannerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FormDraftBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
24
23
|
FormDraftBannerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: FormDraftBannerComponent, selector: "ngx-form-draft-banner", inputs: { visible: "visible", timeLabel: "timeLabel", isRestored: "isRestored", restoredText: "restoredText", savedText: "savedText", savedLabel: "savedLabel", discardText: "discardText" }, outputs: { discard: "discard" }, ngImport: i0, template: `
|
|
25
|
-
<div class="form-draft-banner" *ngIf="visible"
|
|
24
|
+
<div class="form-draft-banner" *ngIf="visible">
|
|
26
25
|
<div class="form-draft-banner__icon">
|
|
27
26
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
28
27
|
<path d="M12 8V12L14.5 14.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
@@ -44,21 +43,11 @@ FormDraftBannerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0
|
|
|
44
43
|
</button>
|
|
45
44
|
</div>
|
|
46
45
|
</div>
|
|
47
|
-
`, isInline: true, styles: [":host{display:block;width:100%}.form-draft-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;margin-bottom:12px;border-radius:8px;background:linear-gradient(135deg,#eef6ff 0%,#f0f4ff 100%);border:1px solid #c5ddf8;box-shadow:0 2px 8px #128ad614}.form-draft-banner__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,#128ad6,#22b9ff);color:#fff;flex-shrink:0}.form-draft-banner__content{flex:1;min-width:0}.form-draft-banner__text{font-size:13px;font-weight:600;color:#1a3a5c}.form-draft-banner__time{font-weight:400;color:#6b8aaa;font-size:12px}.form-draft-banner__actions{flex-shrink:0}.form-draft-banner__btn{border:none;padding:5px 12px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s ease}.form-draft-banner__btn--discard{background:transparent;color:#8899a6;border:1px solid #d0dce6}.form-draft-banner__btn--discard:hover{background:#fef2f2;color:#e62e43;border-color:#e62e43}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }],
|
|
48
|
-
trigger('slideDown', [
|
|
49
|
-
transition(':enter', [
|
|
50
|
-
style({ opacity: 0, transform: 'translateY(-8px)' }),
|
|
51
|
-
animate('250ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 1, transform: 'translateY(0)' }))
|
|
52
|
-
]),
|
|
53
|
-
transition(':leave', [
|
|
54
|
-
animate('200ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 0, transform: 'translateY(-8px)' }))
|
|
55
|
-
])
|
|
56
|
-
])
|
|
57
|
-
], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
46
|
+
`, isInline: true, styles: [":host{display:block;width:100%}.form-draft-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;margin-bottom:12px;border-radius:8px;background:linear-gradient(135deg,#eef6ff 0%,#f0f4ff 100%);border:1px solid #c5ddf8;box-shadow:0 2px 8px #128ad614;animation:slideDown .25s cubic-bezier(.4,0,.2,1)}@keyframes slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.form-draft-banner__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,#128ad6,#22b9ff);color:#fff;flex-shrink:0}.form-draft-banner__content{flex:1;min-width:0}.form-draft-banner__text{font-size:13px;font-weight:600;color:#1a3a5c}.form-draft-banner__time{font-weight:400;color:#6b8aaa;font-size:12px}.form-draft-banner__actions{flex-shrink:0}.form-draft-banner__btn{border:none;padding:5px 12px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s ease}.form-draft-banner__btn--discard{background:transparent;color:#8899a6;border:1px solid #d0dce6}.form-draft-banner__btn--discard:hover{background:#fef2f2;color:#e62e43;border-color:#e62e43}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
58
47
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: FormDraftBannerComponent, decorators: [{
|
|
59
48
|
type: Component,
|
|
60
49
|
args: [{ selector: 'ngx-form-draft-banner', template: `
|
|
61
|
-
<div class="form-draft-banner" *ngIf="visible"
|
|
50
|
+
<div class="form-draft-banner" *ngIf="visible">
|
|
62
51
|
<div class="form-draft-banner__icon">
|
|
63
52
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
64
53
|
<path d="M12 8V12L14.5 14.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
@@ -80,17 +69,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
80
69
|
</button>
|
|
81
70
|
</div>
|
|
82
71
|
</div>
|
|
83
|
-
`,
|
|
84
|
-
trigger('slideDown', [
|
|
85
|
-
transition(':enter', [
|
|
86
|
-
style({ opacity: 0, transform: 'translateY(-8px)' }),
|
|
87
|
-
animate('250ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 1, transform: 'translateY(0)' }))
|
|
88
|
-
]),
|
|
89
|
-
transition(':leave', [
|
|
90
|
-
animate('200ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 0, transform: 'translateY(-8px)' }))
|
|
91
|
-
])
|
|
92
|
-
])
|
|
93
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%}.form-draft-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;margin-bottom:12px;border-radius:8px;background:linear-gradient(135deg,#eef6ff 0%,#f0f4ff 100%);border:1px solid #c5ddf8;box-shadow:0 2px 8px #128ad614}.form-draft-banner__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,#128ad6,#22b9ff);color:#fff;flex-shrink:0}.form-draft-banner__content{flex:1;min-width:0}.form-draft-banner__text{font-size:13px;font-weight:600;color:#1a3a5c}.form-draft-banner__time{font-weight:400;color:#6b8aaa;font-size:12px}.form-draft-banner__actions{flex-shrink:0}.form-draft-banner__btn{border:none;padding:5px 12px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s ease}.form-draft-banner__btn--discard{background:transparent;color:#8899a6;border:1px solid #d0dce6}.form-draft-banner__btn--discard:hover{background:#fef2f2;color:#e62e43;border-color:#e62e43}\n"] }]
|
|
72
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%}.form-draft-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;margin-bottom:12px;border-radius:8px;background:linear-gradient(135deg,#eef6ff 0%,#f0f4ff 100%);border:1px solid #c5ddf8;box-shadow:0 2px 8px #128ad614;animation:slideDown .25s cubic-bezier(.4,0,.2,1)}@keyframes slideDown{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.form-draft-banner__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:6px;background:linear-gradient(135deg,#128ad6,#22b9ff);color:#fff;flex-shrink:0}.form-draft-banner__content{flex:1;min-width:0}.form-draft-banner__text{font-size:13px;font-weight:600;color:#1a3a5c}.form-draft-banner__time{font-weight:400;color:#6b8aaa;font-size:12px}.form-draft-banner__actions{flex-shrink:0}.form-draft-banner__btn{border:none;padding:5px 12px;border-radius:6px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s ease}.form-draft-banner__btn--discard{background:transparent;color:#8899a6;border:1px solid #d0dce6}.form-draft-banner__btn--discard:hover{background:#fef2f2;color:#e62e43;border-color:#e62e43}\n"] }]
|
|
94
73
|
}], propDecorators: { visible: [{
|
|
95
74
|
type: Input
|
|
96
75
|
}], timeLabel: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-form-draft.mjs","sources":["../../src/form-draft-banner.component.ts","../../src/form-draft.service.ts","../../src/form-draft.directive.ts","../../src/ngx-form-draft.module.ts","../../src/ngx-form-draft.ts"],"sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\n\n@Component({\n selector: 'ngx-form-draft-banner',\n template: `\n <div class=\"form-draft-banner\" *ngIf=\"visible\" [@slideDown]>\n <div class=\"form-draft-banner__icon\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 8V12L14.5 14.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n </div>\n <div class=\"form-draft-banner__content\">\n <span class=\"form-draft-banner__text\">\n <span *ngIf=\"isRestored\">{{ restoredText }}</span>\n <span *ngIf=\"!isRestored\">{{ savedText }}</span>\n <span class=\"form-draft-banner__time\" *ngIf=\"timeLabel && isRestored\">\n · {{ savedLabel }} {{ timeLabel }}\n </span>\n </span>\n </div>\n <div class=\"form-draft-banner__actions\">\n <button class=\"form-draft-banner__btn form-draft-banner__btn--discard\" (click)=\"discard.emit()\" type=\"button\">\n ✕ {{ discardText }}\n </button>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; width: 100%; }\n .form-draft-banner {\n display: flex; align-items: center; gap: 10px; padding: 10px 14px; margin-bottom: 12px;\n border-radius: 8px; background: linear-gradient(135deg, #eef6ff 0%, #f0f4ff 100%);\n border: 1px solid #c5ddf8; box-shadow: 0 2px 8px rgba(18, 138, 214, 0.08);\n }\n .form-draft-banner__icon {\n display: flex; align-items: center; justify-content: center; width: 32px; height: 32px;\n border-radius: 6px; background: linear-gradient(135deg, #128ad6, #22b9ff); color: #fff; flex-shrink: 0;\n }\n .form-draft-banner__content { flex: 1; min-width: 0; }\n .form-draft-banner__text { font-size: 13px; font-weight: 600; color: #1a3a5c; }\n .form-draft-banner__time { font-weight: 400; color: #6b8aaa; font-size: 12px; }\n .form-draft-banner__actions { flex-shrink: 0; }\n .form-draft-banner__btn {\n border: none; padding: 5px 12px; border-radius: 6px; font-size: 12px;\n font-weight: 600; cursor: pointer; transition: all 0.2s ease;\n }\n .form-draft-banner__btn--discard { background: transparent; color: #8899a6; border: 1px solid #d0dce6; }\n .form-draft-banner__btn--discard:hover { background: #fef2f2; color: #e62e43; border-color: #e62e43; }\n `],\n animations: [\n trigger('slideDown', [\n transition(':enter', [\n style({ opacity: 0, transform: 'translateY(-8px)' }),\n animate('250ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 1, transform: 'translateY(0)' }))\n ]),\n transition(':leave', [\n animate('200ms cubic-bezier(0.4, 0, 0.2, 1)', style({ opacity: 0, transform: 'translateY(-8px)' }))\n ])\n ])\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormDraftBannerComponent {\n @Input() visible = false;\n @Input() timeLabel = '';\n @Input() isRestored = false;\n @Input() restoredText = 'Draft restored';\n @Input() savedText = 'Draft saved';\n @Input() savedLabel = 'saved';\n @Input() discardText = 'Discard';\n @Output() discard = new EventEmitter<void>();\n}\n","import { Injectable } from '@angular/core';\n\nexport interface FormDraftData {\n values: Record<string, any>;\n savedAt: number;\n formId: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FormDraftService {\n private readonly STORAGE_PREFIX = 'form_draft_';\n private readonly MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\n private buildKey(formId: string): string {\n return `${this.STORAGE_PREFIX}${formId}`;\n }\n\n save(formId: string, values: Record<string, any>): void {\n try {\n const draft: FormDraftData = { values, savedAt: Date.now(), formId };\n localStorage.setItem(this.buildKey(formId), JSON.stringify(draft));\n } catch (e) {\n console.warn('[FormDraft] Could not save draft:', e);\n }\n }\n\n load(formId: string): FormDraftData | null {\n try {\n const raw = localStorage.getItem(this.buildKey(formId));\n if (!raw) return null;\n\n const draft: FormDraftData = JSON.parse(raw);\n if (Date.now() - draft.savedAt > this.MAX_AGE_MS) {\n this.clear(formId);\n return null;\n }\n return draft;\n } catch (e) {\n console.warn('[FormDraft] Could not load draft:', e);\n return null;\n }\n }\n\n clear(formId: string): void {\n try {\n localStorage.removeItem(this.buildKey(formId));\n } catch (e) {\n console.warn('[FormDraft] Could not clear draft:', e);\n }\n }\n\n formatTimestamp(timestamp: number): string {\n const seconds = Math.floor((Date.now() - timestamp) / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n }\n}\n","import {\n Directive, Input, OnInit, OnDestroy, Optional, ComponentRef,\n ViewContainerRef, ChangeDetectorRef, ElementRef, Renderer2,\n} from '@angular/core';\nimport { NgForm, FormGroupDirective, AbstractControl, FormArray, FormGroup, FormControl } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { FormDraftService } from './form-draft.service';\nimport { FormDraftBannerComponent } from './form-draft-banner.component';\n\n/**\n * Auto-saves and restores form drafts\n * \n * @example\n * <form [formGroup]=\"myForm\" ngxFormDraft=\"myFormId\">\n * \n * @example\n * <form [formGroup]=\"myForm\" [ngxFormDraft]=\"'edit_' + entityId\" [draftExcludeFields]=\"['password']\">\n */\n@Directive({\n selector: '[ngxFormDraft]',\n})\nexport class FormDraftDirective implements OnInit, OnDestroy {\n @Input('ngxFormDraft') formId!: string;\n @Input() draftDebounce = 800;\n @Input() draftExcludeFields: string[] = [];\n @Input() draftShowOnChange = false;\n @Input() draftRestoredText = 'Draft restored';\n @Input() draftSavedText = 'Draft saved';\n @Input() draftSavedLabel = 'saved';\n @Input() draftDiscardText = 'Discard';\n\n private destroy$ = new Subject<void>();\n private bannerRef: ComponentRef<FormDraftBannerComponent> | null = null;\n private formControl: AbstractControl | null = null;\n private initialValues: Record<string, any> = {};\n private isRestoring = false;\n\n constructor(\n @Optional() private formGroupDir: FormGroupDirective,\n @Optional() private ngForm: NgForm,\n private draftService: FormDraftService,\n private viewContainerRef: ViewContainerRef,\n private cdRef: ChangeDetectorRef,\n private elRef: ElementRef,\n private renderer: Renderer2,\n ) {}\n\n ngOnInit(): void {\n this.formControl = this.formGroupDir?.form || this.ngForm?.form || null;\n if (!this.formControl || !this.formId) return;\n\n this.initialValues = JSON.parse(JSON.stringify(this.formControl.value));\n\n const draft = this.draftService.load(this.formId);\n if (draft) {\n this.restoreDraft(draft.values);\n this.showBanner(draft.savedAt, true);\n }\n\n this.formControl.valueChanges\n .pipe(debounceTime(this.draftDebounce), takeUntil(this.destroy$))\n .subscribe((values) => {\n if (this.isRestoring) return;\n this.saveDraft(values);\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.destroyBanner();\n }\n\n private saveDraft(values: Record<string, any>): void {\n const filtered = this.filterFields(values);\n \n if (this.isAllEmpty(filtered) || this.matchesInitialValues(filtered)) {\n return;\n }\n\n this.draftService.save(this.formId, filtered);\n if (this.draftShowOnChange && !this.bannerRef) {\n this.showBanner(Date.now(), false);\n }\n }\n\n private filterFields(values: Record<string, any>): Record<string, any> {\n if (!this.draftExcludeFields.length) return values;\n const result = { ...values };\n this.draftExcludeFields.forEach(field => delete result[field]);\n return result;\n }\n\n private isAllEmpty(values: Record<string, any>): boolean {\n return Object.values(values).every(\n v => v === null || v === undefined || v === '' || (Array.isArray(v) && v.length === 0)\n );\n }\n\n private matchesInitialValues(values: Record<string, any>): boolean {\n return JSON.stringify(values) === JSON.stringify(this.initialValues);\n }\n\n private restoreDraft(values: Record<string, any>): void {\n if (!this.formControl) return;\n this.isRestoring = true;\n\n const form = this.formGroupDir?.form || this.ngForm?.form;\n if (form) {\n this.prepareFormArrays(form, values);\n form.patchValue(values);\n }\n\n setTimeout(() => this.isRestoring = false, 100);\n }\n\n private prepareFormArrays(control: AbstractControl, value: any): void {\n if (!control || value == null) return;\n\n if (control instanceof FormGroup && value && typeof value === 'object' && !Array.isArray(value)) {\n Object.keys(value).forEach(key => {\n const childControl = control.get(key);\n if (childControl) this.prepareFormArrays(childControl, value[key]);\n });\n return;\n }\n\n if (control instanceof FormArray && Array.isArray(value)) {\n const formArray = control as FormArray;\n\n while (formArray.length < value.length) {\n const template = formArray.at(0);\n if (template instanceof FormGroup) {\n const newGroup = new FormGroup({});\n Object.keys(template.controls).forEach(ctrlName => {\n const existing = template.get(ctrlName) as AbstractControl;\n if (existing instanceof FormArray) {\n newGroup.addControl(ctrlName, new FormArray([]));\n } else if (existing instanceof FormGroup) {\n newGroup.addControl(ctrlName, new FormGroup({}));\n } else {\n newGroup.addControl(ctrlName, new FormControl(null));\n }\n });\n formArray.push(newGroup);\n } else if (template) {\n formArray.push(new FormControl(null));\n } else {\n const firstValue = value[0];\n if (firstValue && typeof firstValue === 'object' && !Array.isArray(firstValue)) {\n const group = new FormGroup({});\n Object.keys(firstValue).forEach(key => group.addControl(key, new FormControl(null)));\n formArray.push(group);\n } else {\n formArray.push(new FormControl(null));\n }\n }\n }\n\n while (formArray.length > value.length) {\n formArray.removeAt(formArray.length - 1);\n }\n\n value.forEach((childValue, index) => {\n this.prepareFormArrays(formArray.at(index), childValue);\n });\n }\n }\n\n private discardDraft(): void {\n this.draftService.clear(this.formId);\n\n if (this.formControl) {\n this.isRestoring = true;\n const form = this.formGroupDir?.form || this.ngForm?.form;\n if (form) {\n this.prepareFormArrays(form, this.initialValues);\n form.reset(this.initialValues);\n }\n setTimeout(() => {\n this.isRestoring = false;\n }, this.draftDebounce + 200);\n }\n\n this.destroyBanner();\n }\n\n private showBanner(savedAt: number, isRestored = false): void {\n this.bannerRef = this.viewContainerRef.createComponent(FormDraftBannerComponent);\n this.bannerRef.setInput('visible', true);\n this.bannerRef.setInput('isRestored', isRestored);\n this.bannerRef.setInput('timeLabel', isRestored ? this.draftService.formatTimestamp(savedAt) : '');\n this.bannerRef.setInput('restoredText', this.draftRestoredText);\n this.bannerRef.setInput('savedText', this.draftSavedText);\n this.bannerRef.setInput('savedLabel', this.draftSavedLabel);\n this.bannerRef.setInput('discardText', this.draftDiscardText);\n\n this.bannerRef.instance.discard.subscribe(() => this.discardDraft());\n\n const bannerEl = this.bannerRef.location.nativeElement;\n const formEl = this.elRef.nativeElement;\n this.renderer.insertBefore(formEl, bannerEl, formEl.firstChild);\n\n this.cdRef.detectChanges();\n }\n\n private destroyBanner(): void {\n if (this.bannerRef) {\n this.bannerRef.destroy();\n this.bannerRef = null;\n }\n }\n\n public clearDraft(): void {\n this.draftService.clear(this.formId);\n this.destroyBanner();\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormDraftDirective } from './form-draft.directive';\nimport { FormDraftBannerComponent } from './form-draft-banner.component';\n\n@NgModule({\n declarations: [FormDraftDirective, FormDraftBannerComponent],\n imports: [CommonModule],\n exports: [FormDraftDirective, FormDraftBannerComponent],\n})\nexport class NgxFormDraftModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2.FormDraftService"],"mappings":";;;;;;;;;;MAgEa,wBAAwB,CAAA;AA7DrC,IAAA,WAAA,GAAA;QA8DW,IAAO,CAAA,OAAA,GAAG,KAAK,CAAC;QAChB,IAAS,CAAA,SAAA,GAAG,EAAE,CAAC;QACf,IAAU,CAAA,UAAA,GAAG,KAAK,CAAC;QACnB,IAAY,CAAA,YAAA,GAAG,gBAAgB,CAAC;QAChC,IAAS,CAAA,SAAA,GAAG,aAAa,CAAC;QAC1B,IAAU,CAAA,UAAA,GAAG,OAAO,CAAC;QACrB,IAAW,CAAA,WAAA,GAAG,SAAS,CAAC;AACvB,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,YAAY,EAAQ,CAAC;AAC9C,KAAA;;qHATY,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,wBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EA3DzB,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBT,EAuBW,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,4/BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA;QACV,OAAO,CAAC,WAAW,EAAE;YACnB,UAAU,CAAC,QAAQ,EAAE;gBACnB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;AACpD,gBAAA,OAAO,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;aACjG,CAAC;YACF,UAAU,CAAC,QAAQ,EAAE;AACnB,gBAAA,OAAO,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;aACpG,CAAC;SACH,CAAC;AACH,KAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;2FAGU,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBA7DpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EACvB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBT,EAuBW,UAAA,EAAA;wBACV,OAAO,CAAC,WAAW,EAAE;4BACnB,UAAU,CAAC,QAAQ,EAAE;gCACnB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;AACpD,gCAAA,OAAO,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;6BACjG,CAAC;4BACF,UAAU,CAAC,QAAQ,EAAE;AACnB,gCAAA,OAAO,CAAC,oCAAoC,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;6BACpG,CAAC;yBACH,CAAC;qBACH,EACgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,4/BAAA,CAAA,EAAA,CAAA;8BAGtC,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBACG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBACG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBACG,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBACG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBACG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBACI,OAAO,EAAA,CAAA;sBAAhB,MAAM;;;MC7DI,gBAAgB,CAAA;AAH7B,IAAA,WAAA,GAAA;QAImB,IAAc,CAAA,cAAA,GAAG,aAAa,CAAC;QAC/B,IAAU,CAAA,UAAA,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAkDvD,KAAA;AAhDS,IAAA,QAAQ,CAAC,MAAc,EAAA;AAC7B,QAAA,OAAO,GAAG,IAAI,CAAC,cAAc,CAAG,EAAA,MAAM,EAAE,CAAC;KAC1C;IAED,IAAI,CAAC,MAAc,EAAE,MAA2B,EAAA;QAC9C,IAAI;AACF,YAAA,MAAM,KAAK,GAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC;AACrE,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACpE,SAAA;AAAC,QAAA,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,CAAC,CAAC,CAAC;AACtD,SAAA;KACF;AAED,IAAA,IAAI,CAAC,MAAc,EAAA;QACjB,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACxD,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,IAAI,CAAC;YAEtB,MAAM,KAAK,GAAkB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC7C,YAAA,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AAChD,gBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACnB,gBAAA,OAAO,IAAI,CAAC;AACb,aAAA;AACD,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;AAAC,QAAA,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,CAAC,CAAC,CAAC;AACrD,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;KACF;AAED,IAAA,KAAK,CAAC,MAAc,EAAA;QAClB,IAAI;YACF,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAChD,SAAA;AAAC,QAAA,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,CAAC,CAAC,CAAC;AACvD,SAAA;KACF;AAED,IAAA,eAAe,CAAC,SAAiB,EAAA;AAC/B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,IAAI,CAAC,CAAC;QAC5D,IAAI,OAAO,GAAG,EAAE;AAAE,YAAA,OAAO,UAAU,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACzC,IAAI,OAAO,GAAG,EAAE;YAAE,OAAO,CAAA,EAAG,OAAO,CAAA,KAAA,CAAO,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACvC,IAAI,KAAK,GAAG,EAAE;YAAE,OAAO,CAAA,EAAG,KAAK,CAAA,KAAA,CAAO,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACpC,OAAO,CAAA,EAAG,IAAI,CAAA,KAAA,CAAO,CAAC;KACvB;;6GAnDU,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAhB,gBAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA,CAAA;2FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;ACAD;;;;;;;;AAQG;MAIU,kBAAkB,CAAA;AAgB7B,IAAA,WAAA,CACsB,YAAgC,EAChC,MAAc,EAC1B,YAA8B,EAC9B,gBAAkC,EAClC,KAAwB,EACxB,KAAiB,EACjB,QAAmB,EAAA;QANP,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAoB;QAChC,IAAM,CAAA,MAAA,GAAN,MAAM,CAAQ;QAC1B,IAAY,CAAA,YAAA,GAAZ,YAAY,CAAkB;QAC9B,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAkB;QAClC,IAAK,CAAA,KAAA,GAAL,KAAK,CAAmB;QACxB,IAAK,CAAA,KAAA,GAAL,KAAK,CAAY;QACjB,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAW;QArBpB,IAAa,CAAA,aAAA,GAAG,GAAG,CAAC;QACpB,IAAkB,CAAA,kBAAA,GAAa,EAAE,CAAC;QAClC,IAAiB,CAAA,iBAAA,GAAG,KAAK,CAAC;QAC1B,IAAiB,CAAA,iBAAA,GAAG,gBAAgB,CAAC;QACrC,IAAc,CAAA,cAAA,GAAG,aAAa,CAAC;QAC/B,IAAe,CAAA,eAAA,GAAG,OAAO,CAAC;QAC1B,IAAgB,CAAA,gBAAA,GAAG,SAAS,CAAC;AAE9B,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ,CAAC;QAC/B,IAAS,CAAA,SAAA,GAAkD,IAAI,CAAC;QAChE,IAAW,CAAA,WAAA,GAA2B,IAAI,CAAC;QAC3C,IAAa,CAAA,aAAA,GAAwB,EAAE,CAAC;QACxC,IAAW,CAAA,WAAA,GAAG,KAAK,CAAC;KAUxB;IAEJ,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;AAE9C,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;AAExE,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAClD,QAAA,IAAI,KAAK,EAAE;AACT,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACtC,SAAA;QAED,IAAI,CAAC,WAAW,CAAC,YAAY;AAC1B,aAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChE,aAAA,SAAS,CAAC,CAAC,MAAM,KAAI;YACpB,IAAI,IAAI,CAAC,WAAW;gBAAE,OAAO;AAC7B,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AACzB,SAAC,CAAC,CAAC;KACN;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,EAAE,CAAC;KACtB;AAEO,IAAA,SAAS,CAAC,MAA2B,EAAA;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;AAE3C,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAE;YACpE,OAAO;AACR,SAAA;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;AACpC,SAAA;KACF;AAEO,IAAA,YAAY,CAAC,MAA2B,EAAA;AAC9C,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM;AAAE,YAAA,OAAO,MAAM,CAAC;AACnD,QAAA,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/D,QAAA,OAAO,MAAM,CAAC;KACf;AAEO,IAAA,UAAU,CAAC,MAA2B,EAAA;AAC5C,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAChC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CACvF,CAAC;KACH;AAEO,IAAA,oBAAoB,CAAC,MAA2B,EAAA;AACtD,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;KACtE;AAEO,IAAA,YAAY,CAAC,MAA2B,EAAA;QAC9C,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;AAC9B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AAExB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC1D,QAAA,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACrC,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACzB,SAAA;AAED,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;KACjD;IAEO,iBAAiB,CAAC,OAAwB,EAAE,KAAU,EAAA;AAC5D,QAAA,IAAI,CAAC,OAAO,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO;AAEtC,QAAA,IAAI,OAAO,YAAY,SAAS,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC/F,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;gBAC/B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACtC,gBAAA,IAAI,YAAY;oBAAE,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACrE,aAAC,CAAC,CAAC;YACH,OAAO;AACR,SAAA;QAED,IAAI,OAAO,YAAY,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxD,MAAM,SAAS,GAAG,OAAoB,CAAC;AAEvC,YAAA,OAAO,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE;gBACtC,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACjC,IAAI,QAAQ,YAAY,SAAS,EAAE;AACjC,oBAAA,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;AACnC,oBAAA,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAG;wBAChD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAoB,CAAC;wBAC3D,IAAI,QAAQ,YAAY,SAAS,EAAE;4BACjC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,yBAAA;6BAAM,IAAI,QAAQ,YAAY,SAAS,EAAE;4BACxC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,yBAAA;AAAM,6BAAA;4BACL,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,yBAAA;AACH,qBAAC,CAAC,CAAC;AACH,oBAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC1B,iBAAA;AAAM,qBAAA,IAAI,QAAQ,EAAE;oBACnB,SAAS,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,iBAAA;AAAM,qBAAA;AACL,oBAAA,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC5B,oBAAA,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;AAC9E,wBAAA,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;wBAChC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrF,wBAAA,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACvB,qBAAA;AAAM,yBAAA;wBACL,SAAS,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,qBAAA;AACF,iBAAA;AACF,aAAA;AAED,YAAA,OAAO,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE;gBACtC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC1C,aAAA;YAED,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,KAAK,KAAI;AAClC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC;AAC1D,aAAC,CAAC,CAAC;AACJ,SAAA;KACF;IAEO,YAAY,GAAA;QAClB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErC,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACxB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC1D,YAAA,IAAI,IAAI,EAAE;gBACR,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;AACjD,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAChC,aAAA;YACD,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AAC3B,aAAC,EAAE,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC;AAC9B,SAAA;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;KACtB;AAEO,IAAA,UAAU,CAAC,OAAe,EAAE,UAAU,GAAG,KAAK,EAAA;QACpD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACjF,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACnG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5D,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAE9D,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAErE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC;AACvD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;AAEhE,QAAA,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;KAC5B;IAEO,aAAa,GAAA;QACnB,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;AACzB,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACvB,SAAA;KACF;IAEM,UAAU,GAAA;QACf,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,aAAa,EAAE,CAAC;KACtB;;+GAnMU,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAlB,kBAAkB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,QAAA,CAAA,EAAA,aAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC3B,iBAAA,CAAA;;0BAkBI,QAAQ;;0BACR,QAAQ;wLAjBY,MAAM,EAAA,CAAA;sBAA5B,KAAK;uBAAC,cAAc,CAAA;gBACZ,aAAa,EAAA,CAAA;sBAArB,KAAK;gBACG,kBAAkB,EAAA,CAAA;sBAA1B,KAAK;gBACG,iBAAiB,EAAA,CAAA;sBAAzB,KAAK;gBACG,iBAAiB,EAAA,CAAA;sBAAzB,KAAK;gBACG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBACG,eAAe,EAAA,CAAA;sBAAvB,KAAK;gBACG,gBAAgB,EAAA,CAAA;sBAAxB,KAAK;;;MCpBK,kBAAkB,CAAA;;+GAAlB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;gHAAlB,kBAAkB,EAAA,YAAA,EAAA,CAJd,kBAAkB,EAAE,wBAAwB,aACjD,YAAY,CAAA,EAAA,OAAA,EAAA,CACZ,kBAAkB,EAAE,wBAAwB,CAAA,EAAA,CAAA,CAAA;AAE3C,kBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,YAHnB,YAAY,CAAA,EAAA,CAAA,CAAA;2FAGX,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAL9B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,CAAC,kBAAkB,EAAE,wBAAwB,CAAC;oBAC5D,OAAO,EAAE,CAAC,YAAY,CAAC;AACvB,oBAAA,OAAO,EAAE,CAAC,kBAAkB,EAAE,wBAAwB,CAAC;AACxD,iBAAA,CAAA;;;ACTD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"ngx-form-draft.mjs","sources":["../../src/form-draft-banner.component.ts","../../src/form-draft.service.ts","../../src/form-draft.directive.ts","../../src/ngx-form-draft.module.ts","../../src/ngx-form-draft.ts"],"sourcesContent":["import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';\n\n@Component({\n selector: 'ngx-form-draft-banner',\n template: `\n <div class=\"form-draft-banner\" *ngIf=\"visible\">\n <div class=\"form-draft-banner__icon\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 8V12L14.5 14.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n </div>\n <div class=\"form-draft-banner__content\">\n <span class=\"form-draft-banner__text\">\n <span *ngIf=\"isRestored\">{{ restoredText }}</span>\n <span *ngIf=\"!isRestored\">{{ savedText }}</span>\n <span class=\"form-draft-banner__time\" *ngIf=\"timeLabel && isRestored\">\n · {{ savedLabel }} {{ timeLabel }}\n </span>\n </span>\n </div>\n <div class=\"form-draft-banner__actions\">\n <button class=\"form-draft-banner__btn form-draft-banner__btn--discard\" (click)=\"discard.emit()\" type=\"button\">\n ✕ {{ discardText }}\n </button>\n </div>\n </div>\n `,\n styles: [`\n :host { display: block; width: 100%; }\n .form-draft-banner {\n display: flex; align-items: center; gap: 10px; padding: 10px 14px; margin-bottom: 12px;\n border-radius: 8px; background: linear-gradient(135deg, #eef6ff 0%, #f0f4ff 100%);\n border: 1px solid #c5ddf8; box-shadow: 0 2px 8px rgba(18, 138, 214, 0.08);\n animation: slideDown 250ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n @keyframes slideDown {\n from { opacity: 0; transform: translateY(-8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n .form-draft-banner__icon {\n display: flex; align-items: center; justify-content: center; width: 32px; height: 32px;\n border-radius: 6px; background: linear-gradient(135deg, #128ad6, #22b9ff); color: #fff; flex-shrink: 0;\n }\n .form-draft-banner__content { flex: 1; min-width: 0; }\n .form-draft-banner__text { font-size: 13px; font-weight: 600; color: #1a3a5c; }\n .form-draft-banner__time { font-weight: 400; color: #6b8aaa; font-size: 12px; }\n .form-draft-banner__actions { flex-shrink: 0; }\n .form-draft-banner__btn {\n border: none; padding: 5px 12px; border-radius: 6px; font-size: 12px;\n font-weight: 600; cursor: pointer; transition: all 0.2s ease;\n }\n .form-draft-banner__btn--discard { background: transparent; color: #8899a6; border: 1px solid #d0dce6; }\n .form-draft-banner__btn--discard:hover { background: #fef2f2; color: #e62e43; border-color: #e62e43; }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormDraftBannerComponent {\n @Input() visible = false;\n @Input() timeLabel = '';\n @Input() isRestored = false;\n @Input() restoredText = 'Draft restored';\n @Input() savedText = 'Draft saved';\n @Input() savedLabel = 'saved';\n @Input() discardText = 'Discard';\n @Output() discard = new EventEmitter<void>();\n}\n","import { Injectable } from '@angular/core';\n\nexport interface FormDraftData {\n values: Record<string, any>;\n savedAt: number;\n formId: string;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FormDraftService {\n private readonly STORAGE_PREFIX = 'form_draft_';\n private readonly MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\n private buildKey(formId: string): string {\n return `${this.STORAGE_PREFIX}${formId}`;\n }\n\n save(formId: string, values: Record<string, any>): void {\n try {\n const draft: FormDraftData = { values, savedAt: Date.now(), formId };\n localStorage.setItem(this.buildKey(formId), JSON.stringify(draft));\n } catch (e) {\n console.warn('[FormDraft] Could not save draft:', e);\n }\n }\n\n load(formId: string): FormDraftData | null {\n try {\n const raw = localStorage.getItem(this.buildKey(formId));\n if (!raw) return null;\n\n const draft: FormDraftData = JSON.parse(raw);\n if (Date.now() - draft.savedAt > this.MAX_AGE_MS) {\n this.clear(formId);\n return null;\n }\n return draft;\n } catch (e) {\n console.warn('[FormDraft] Could not load draft:', e);\n return null;\n }\n }\n\n clear(formId: string): void {\n try {\n localStorage.removeItem(this.buildKey(formId));\n } catch (e) {\n console.warn('[FormDraft] Could not clear draft:', e);\n }\n }\n\n formatTimestamp(timestamp: number): string {\n const seconds = Math.floor((Date.now() - timestamp) / 1000);\n if (seconds < 60) return 'just now';\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n }\n}\n","import {\n Directive, Input, OnInit, OnDestroy, Optional, ComponentRef,\n ViewContainerRef, ChangeDetectorRef, ElementRef, Renderer2,\n} from '@angular/core';\nimport { NgForm, FormGroupDirective, AbstractControl, FormArray, FormGroup, FormControl } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { FormDraftService } from './form-draft.service';\nimport { FormDraftBannerComponent } from './form-draft-banner.component';\n\n/**\n * Auto-saves and restores form drafts\n * \n * @example\n * <form [formGroup]=\"myForm\" ngxFormDraft=\"myFormId\">\n * \n * @example\n * <form [formGroup]=\"myForm\" [ngxFormDraft]=\"'edit_' + entityId\" [draftExcludeFields]=\"['password']\">\n */\n@Directive({\n selector: '[ngxFormDraft]',\n})\nexport class FormDraftDirective implements OnInit, OnDestroy {\n @Input('ngxFormDraft') formId!: string;\n @Input() draftDebounce = 800;\n @Input() draftExcludeFields: string[] = [];\n @Input() draftShowOnChange = false;\n @Input() draftRestoredText = 'Draft restored';\n @Input() draftSavedText = 'Draft saved';\n @Input() draftSavedLabel = 'saved';\n @Input() draftDiscardText = 'Discard';\n\n private destroy$ = new Subject<void>();\n private bannerRef: ComponentRef<FormDraftBannerComponent> | null = null;\n private formControl: AbstractControl | null = null;\n private initialValues: Record<string, any> = {};\n private isRestoring = false;\n\n constructor(\n @Optional() private formGroupDir: FormGroupDirective,\n @Optional() private ngForm: NgForm,\n private draftService: FormDraftService,\n private viewContainerRef: ViewContainerRef,\n private cdRef: ChangeDetectorRef,\n private elRef: ElementRef,\n private renderer: Renderer2,\n ) {}\n\n ngOnInit(): void {\n this.formControl = this.formGroupDir?.form || this.ngForm?.form || null;\n if (!this.formControl || !this.formId) return;\n\n this.initialValues = JSON.parse(JSON.stringify(this.formControl.value));\n\n const draft = this.draftService.load(this.formId);\n if (draft) {\n this.restoreDraft(draft.values);\n this.showBanner(draft.savedAt, true);\n }\n\n this.formControl.valueChanges\n .pipe(debounceTime(this.draftDebounce), takeUntil(this.destroy$))\n .subscribe((values) => {\n if (this.isRestoring) return;\n this.saveDraft(values);\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n this.destroyBanner();\n }\n\n private saveDraft(values: Record<string, any>): void {\n const filtered = this.filterFields(values);\n \n if (this.isAllEmpty(filtered) || this.matchesInitialValues(filtered)) {\n return;\n }\n\n this.draftService.save(this.formId, filtered);\n if (this.draftShowOnChange && !this.bannerRef) {\n this.showBanner(Date.now(), false);\n }\n }\n\n private filterFields(values: Record<string, any>): Record<string, any> {\n if (!this.draftExcludeFields.length) return values;\n const result = { ...values };\n this.draftExcludeFields.forEach(field => delete result[field]);\n return result;\n }\n\n private isAllEmpty(values: Record<string, any>): boolean {\n return Object.values(values).every(\n v => v === null || v === undefined || v === '' || (Array.isArray(v) && v.length === 0)\n );\n }\n\n private matchesInitialValues(values: Record<string, any>): boolean {\n return JSON.stringify(values) === JSON.stringify(this.initialValues);\n }\n\n private restoreDraft(values: Record<string, any>): void {\n if (!this.formControl) return;\n this.isRestoring = true;\n\n const form = this.formGroupDir?.form || this.ngForm?.form;\n if (form) {\n this.prepareFormArrays(form, values);\n form.patchValue(values);\n }\n\n setTimeout(() => this.isRestoring = false, 100);\n }\n\n private prepareFormArrays(control: AbstractControl, value: any): void {\n if (!control || value == null) return;\n\n if (control instanceof FormGroup && value && typeof value === 'object' && !Array.isArray(value)) {\n Object.keys(value).forEach(key => {\n const childControl = control.get(key);\n if (childControl) this.prepareFormArrays(childControl, value[key]);\n });\n return;\n }\n\n if (control instanceof FormArray && Array.isArray(value)) {\n const formArray = control as FormArray;\n\n while (formArray.length < value.length) {\n const template = formArray.at(0);\n if (template instanceof FormGroup) {\n const newGroup = new FormGroup({});\n Object.keys(template.controls).forEach(ctrlName => {\n const existing = template.get(ctrlName) as AbstractControl;\n if (existing instanceof FormArray) {\n newGroup.addControl(ctrlName, new FormArray([]));\n } else if (existing instanceof FormGroup) {\n newGroup.addControl(ctrlName, new FormGroup({}));\n } else {\n newGroup.addControl(ctrlName, new FormControl(null));\n }\n });\n formArray.push(newGroup);\n } else if (template) {\n formArray.push(new FormControl(null));\n } else {\n const firstValue = value[0];\n if (firstValue && typeof firstValue === 'object' && !Array.isArray(firstValue)) {\n const group = new FormGroup({});\n Object.keys(firstValue).forEach(key => group.addControl(key, new FormControl(null)));\n formArray.push(group);\n } else {\n formArray.push(new FormControl(null));\n }\n }\n }\n\n while (formArray.length > value.length) {\n formArray.removeAt(formArray.length - 1);\n }\n\n value.forEach((childValue, index) => {\n this.prepareFormArrays(formArray.at(index), childValue);\n });\n }\n }\n\n private discardDraft(): void {\n this.draftService.clear(this.formId);\n\n if (this.formControl) {\n this.isRestoring = true;\n const form = this.formGroupDir?.form || this.ngForm?.form;\n if (form) {\n this.prepareFormArrays(form, this.initialValues);\n form.reset(this.initialValues);\n }\n setTimeout(() => {\n this.isRestoring = false;\n }, this.draftDebounce + 200);\n }\n\n this.destroyBanner();\n }\n\n private showBanner(savedAt: number, isRestored = false): void {\n this.bannerRef = this.viewContainerRef.createComponent(FormDraftBannerComponent);\n this.bannerRef.setInput('visible', true);\n this.bannerRef.setInput('isRestored', isRestored);\n this.bannerRef.setInput('timeLabel', isRestored ? this.draftService.formatTimestamp(savedAt) : '');\n this.bannerRef.setInput('restoredText', this.draftRestoredText);\n this.bannerRef.setInput('savedText', this.draftSavedText);\n this.bannerRef.setInput('savedLabel', this.draftSavedLabel);\n this.bannerRef.setInput('discardText', this.draftDiscardText);\n\n this.bannerRef.instance.discard.subscribe(() => this.discardDraft());\n\n const bannerEl = this.bannerRef.location.nativeElement;\n const formEl = this.elRef.nativeElement;\n this.renderer.insertBefore(formEl, bannerEl, formEl.firstChild);\n\n this.cdRef.detectChanges();\n }\n\n private destroyBanner(): void {\n if (this.bannerRef) {\n this.bannerRef.destroy();\n this.bannerRef = null;\n }\n }\n\n public clearDraft(): void {\n this.draftService.clear(this.formId);\n this.destroyBanner();\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormDraftDirective } from './form-draft.directive';\nimport { FormDraftBannerComponent } from './form-draft-banner.component';\n\n@NgModule({\n declarations: [FormDraftDirective, FormDraftBannerComponent],\n imports: [CommonModule],\n exports: [FormDraftDirective, FormDraftBannerComponent],\n})\nexport class NgxFormDraftModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2.FormDraftService"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ngx-form-draft",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Auto-save and restore Angular form drafts with zero dependencies",
|
|
5
5
|
"author": "Neokyuubi",
|
|
6
6
|
"publishConfig": {
|
|
@@ -18,7 +18,6 @@
|
|
|
18
18
|
"@angular/core": ">=14.0.0",
|
|
19
19
|
"@angular/common": ">=14.0.0",
|
|
20
20
|
"@angular/forms": ">=14.0.0",
|
|
21
|
-
"@angular/animations": ">=14.0.0",
|
|
22
21
|
"rxjs": ">=6.0.0"
|
|
23
22
|
},
|
|
24
23
|
"keywords": [
|