angular-data-mapper 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/LICENSE +190 -0
  3. package/PUBLISHING.md +75 -0
  4. package/README.md +214 -0
  5. package/angular.json +121 -0
  6. package/package.json +67 -0
  7. package/projects/demo-app/public/favicon.ico +0 -0
  8. package/projects/demo-app/src/app/app.config.ts +12 -0
  9. package/projects/demo-app/src/app/app.html +36 -0
  10. package/projects/demo-app/src/app/app.routes.ts +62 -0
  11. package/projects/demo-app/src/app/app.scss +65 -0
  12. package/projects/demo-app/src/app/app.ts +11 -0
  13. package/projects/demo-app/src/app/layout/app-layout.component.ts +294 -0
  14. package/projects/demo-app/src/app/pages/mapper-page/mapper-page.component.html +87 -0
  15. package/projects/demo-app/src/app/pages/mapper-page/mapper-page.component.scss +202 -0
  16. package/projects/demo-app/src/app/pages/mapper-page/mapper-page.component.ts +192 -0
  17. package/projects/demo-app/src/app/pages/mappings-page/add-mapping-dialog.component.ts +163 -0
  18. package/projects/demo-app/src/app/pages/mappings-page/mappings-page.component.ts +306 -0
  19. package/projects/demo-app/src/app/pages/schema-creator-page/schema-creator-page.component.ts +88 -0
  20. package/projects/demo-app/src/app/pages/schema-editor-page/schema-editor-page.component.html +108 -0
  21. package/projects/demo-app/src/app/pages/schema-editor-page/schema-editor-page.component.scss +317 -0
  22. package/projects/demo-app/src/app/pages/schema-editor-page/schema-editor-page.component.ts +129 -0
  23. package/projects/demo-app/src/app/services/app-state.service.ts +233 -0
  24. package/projects/demo-app/src/app/services/sample-data.service.ts +228 -0
  25. package/projects/demo-app/src/index.html +15 -0
  26. package/projects/demo-app/src/main.ts +6 -0
  27. package/projects/demo-app/src/styles.scss +54 -0
  28. package/projects/demo-app/tsconfig.app.json +13 -0
  29. package/projects/ngx-data-mapper/ng-package.json +7 -0
  30. package/projects/ngx-data-mapper/package.json +40 -0
  31. package/projects/ngx-data-mapper/src/lib/components/array-filter-modal/array-filter-modal.component.html +183 -0
  32. package/projects/ngx-data-mapper/src/lib/components/array-filter-modal/array-filter-modal.component.scss +352 -0
  33. package/projects/ngx-data-mapper/src/lib/components/array-filter-modal/array-filter-modal.component.ts +277 -0
  34. package/projects/ngx-data-mapper/src/lib/components/array-selector-modal/array-selector-modal.component.html +174 -0
  35. package/projects/ngx-data-mapper/src/lib/components/array-selector-modal/array-selector-modal.component.scss +357 -0
  36. package/projects/ngx-data-mapper/src/lib/components/array-selector-modal/array-selector-modal.component.ts +258 -0
  37. package/projects/ngx-data-mapper/src/lib/components/condition-builder/condition-builder.component.html +139 -0
  38. package/projects/ngx-data-mapper/src/lib/components/condition-builder/condition-builder.component.scss +213 -0
  39. package/projects/ngx-data-mapper/src/lib/components/condition-builder/condition-builder.component.ts +261 -0
  40. package/projects/ngx-data-mapper/src/lib/components/data-mapper/data-mapper.component.html +199 -0
  41. package/projects/ngx-data-mapper/src/lib/components/data-mapper/data-mapper.component.scss +321 -0
  42. package/projects/ngx-data-mapper/src/lib/components/data-mapper/data-mapper.component.ts +618 -0
  43. package/projects/ngx-data-mapper/src/lib/components/default-value-popover/default-value-popover.component.html +67 -0
  44. package/projects/ngx-data-mapper/src/lib/components/default-value-popover/default-value-popover.component.scss +97 -0
  45. package/projects/ngx-data-mapper/src/lib/components/default-value-popover/default-value-popover.component.ts +105 -0
  46. package/projects/ngx-data-mapper/src/lib/components/schema-editor/schema-editor.component.html +552 -0
  47. package/projects/ngx-data-mapper/src/lib/components/schema-editor/schema-editor.component.scss +824 -0
  48. package/projects/ngx-data-mapper/src/lib/components/schema-editor/schema-editor.component.ts +730 -0
  49. package/projects/ngx-data-mapper/src/lib/components/schema-tree/schema-tree.component.html +82 -0
  50. package/projects/ngx-data-mapper/src/lib/components/schema-tree/schema-tree.component.scss +352 -0
  51. package/projects/ngx-data-mapper/src/lib/components/schema-tree/schema-tree.component.ts +225 -0
  52. package/projects/ngx-data-mapper/src/lib/components/transformation-popover/transformation-popover.component.html +346 -0
  53. package/projects/ngx-data-mapper/src/lib/components/transformation-popover/transformation-popover.component.scss +511 -0
  54. package/projects/ngx-data-mapper/src/lib/components/transformation-popover/transformation-popover.component.ts +368 -0
  55. package/projects/ngx-data-mapper/src/lib/models/json-schema.model.ts +164 -0
  56. package/projects/ngx-data-mapper/src/lib/models/schema.model.ts +173 -0
  57. package/projects/ngx-data-mapper/src/lib/services/mapping.service.ts +615 -0
  58. package/projects/ngx-data-mapper/src/lib/services/schema-parser.service.ts +270 -0
  59. package/projects/ngx-data-mapper/src/lib/services/svg-connector.service.ts +135 -0
  60. package/projects/ngx-data-mapper/src/lib/services/transformation.service.ts +453 -0
  61. package/projects/ngx-data-mapper/src/public-api.ts +22 -0
  62. package/projects/ngx-data-mapper/tsconfig.lib.json +13 -0
  63. package/projects/ngx-data-mapper/tsconfig.lib.prod.json +9 -0
  64. package/tsconfig.json +28 -0
@@ -0,0 +1,97 @@
1
+ .popover-backdrop {
2
+ position: fixed;
3
+ top: 0;
4
+ left: 0;
5
+ width: 100%;
6
+ height: 100%;
7
+ background: rgba(0, 0, 0, 0.3);
8
+ z-index: 1000;
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ }
13
+
14
+ .popover-container {
15
+ background: white;
16
+ border-radius: 12px;
17
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
18
+ min-width: 320px;
19
+ max-width: 400px;
20
+ overflow: hidden;
21
+ }
22
+
23
+ .popover-header {
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: space-between;
27
+ padding: 16px 20px;
28
+ background: linear-gradient(135deg, #10b981 0%, #059669 100%);
29
+ color: white;
30
+
31
+ .header-title {
32
+ display: flex;
33
+ align-items: center;
34
+ gap: 8px;
35
+ font-size: 16px;
36
+ font-weight: 600;
37
+
38
+ mat-icon {
39
+ font-size: 20px;
40
+ width: 20px;
41
+ height: 20px;
42
+ }
43
+ }
44
+
45
+ button {
46
+ color: white;
47
+ }
48
+ }
49
+
50
+ .popover-content {
51
+ padding: 20px;
52
+ }
53
+
54
+ .field-info {
55
+ display: flex;
56
+ align-items: center;
57
+ gap: 8px;
58
+ margin-bottom: 16px;
59
+ padding: 10px 12px;
60
+ background: #f8fafc;
61
+ border-radius: 8px;
62
+
63
+ .field-name {
64
+ font-weight: 600;
65
+ color: #1e293b;
66
+ }
67
+
68
+ .field-type {
69
+ font-size: 12px;
70
+ color: #64748b;
71
+ background: #e2e8f0;
72
+ padding: 2px 8px;
73
+ border-radius: 4px;
74
+ text-transform: uppercase;
75
+ }
76
+ }
77
+
78
+ .full-width {
79
+ width: 100%;
80
+ }
81
+
82
+ .boolean-input {
83
+ padding: 12px 0;
84
+ }
85
+
86
+ .popover-actions {
87
+ display: flex;
88
+ align-items: center;
89
+ gap: 8px;
90
+ padding: 16px 20px;
91
+ background: #f8fafc;
92
+ border-top: 1px solid #e2e8f0;
93
+
94
+ .spacer {
95
+ flex: 1;
96
+ }
97
+ }
@@ -0,0 +1,105 @@
1
+ import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { MatButtonModule } from '@angular/material/button';
5
+ import { MatIconModule } from '@angular/material/icon';
6
+ import { MatInputModule } from '@angular/material/input';
7
+ import { MatFormFieldModule } from '@angular/material/form-field';
8
+ import { MatDatepickerModule } from '@angular/material/datepicker';
9
+ import { MatNativeDateModule } from '@angular/material/core';
10
+ import { MatSelectModule } from '@angular/material/select';
11
+ import { MatSlideToggleModule } from '@angular/material/slide-toggle';
12
+ import { SchemaField, DefaultValue } from '../../models/schema.model';
13
+
14
+ @Component({
15
+ selector: 'default-value-popover',
16
+ standalone: true,
17
+ imports: [
18
+ CommonModule,
19
+ FormsModule,
20
+ MatButtonModule,
21
+ MatIconModule,
22
+ MatInputModule,
23
+ MatFormFieldModule,
24
+ MatDatepickerModule,
25
+ MatNativeDateModule,
26
+ MatSelectModule,
27
+ MatSlideToggleModule,
28
+ ],
29
+ templateUrl: './default-value-popover.component.html',
30
+ styleUrl: './default-value-popover.component.scss',
31
+ })
32
+ export class DefaultValuePopoverComponent implements OnInit {
33
+ @Input() field!: SchemaField;
34
+ @Input() existingValue?: DefaultValue;
35
+ @Input() position!: { x: number; y: number };
36
+
37
+ @Output() save = new EventEmitter<string | number | boolean | Date | null>();
38
+ @Output() delete = new EventEmitter<void>();
39
+ @Output() close = new EventEmitter<void>();
40
+
41
+ stringValue = '';
42
+ numberValue: number | null = null;
43
+ booleanValue = false;
44
+ dateValue: Date | null = null;
45
+
46
+ ngOnInit(): void {
47
+ if (this.existingValue) {
48
+ switch (this.fieldType) {
49
+ case 'string':
50
+ this.stringValue = this.existingValue.value as string || '';
51
+ break;
52
+ case 'number':
53
+ this.numberValue = this.existingValue.value as number;
54
+ break;
55
+ case 'boolean':
56
+ this.booleanValue = this.existingValue.value as boolean;
57
+ break;
58
+ case 'date':
59
+ this.dateValue = this.existingValue.value ? new Date(this.existingValue.value as string) : null;
60
+ break;
61
+ }
62
+ }
63
+ }
64
+
65
+ get fieldType(): string {
66
+ if (this.field.type === 'date' || this.field.name.toLowerCase().includes('date')) {
67
+ return 'date';
68
+ }
69
+ return this.field.type;
70
+ }
71
+
72
+ onSave(): void {
73
+ let value: string | number | boolean | Date | null;
74
+
75
+ switch (this.fieldType) {
76
+ case 'number':
77
+ value = this.numberValue;
78
+ break;
79
+ case 'boolean':
80
+ value = this.booleanValue;
81
+ break;
82
+ case 'date':
83
+ value = this.dateValue;
84
+ break;
85
+ default:
86
+ value = this.stringValue || null;
87
+ }
88
+
89
+ this.save.emit(value);
90
+ }
91
+
92
+ onDelete(): void {
93
+ this.delete.emit();
94
+ }
95
+
96
+ onClose(): void {
97
+ this.close.emit();
98
+ }
99
+
100
+ onBackdropClick(event: MouseEvent): void {
101
+ if ((event.target as HTMLElement).classList.contains('popover-backdrop')) {
102
+ this.onClose();
103
+ }
104
+ }
105
+ }