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,511 @@
1
+ .popover-backdrop {
2
+ position: fixed;
3
+ top: 0;
4
+ left: 0;
5
+ right: 0;
6
+ bottom: 0;
7
+ background: rgba(0, 0, 0, 0.3);
8
+ z-index: 999;
9
+ }
10
+
11
+ .transformation-popover {
12
+ position: fixed;
13
+ z-index: 1000;
14
+ width: 420px;
15
+ background: white;
16
+ border-radius: 12px;
17
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
18
+ transform: translate(-50%, -50%);
19
+ animation: popoverIn 0.2s ease-out;
20
+ }
21
+
22
+ @keyframes popoverIn {
23
+ from {
24
+ opacity: 0;
25
+ transform: translate(-50%, -50%) scale(0.95);
26
+ }
27
+ to {
28
+ opacity: 1;
29
+ transform: translate(-50%, -50%) scale(1);
30
+ }
31
+ }
32
+
33
+ .popover-header {
34
+ display: flex;
35
+ align-items: center;
36
+ justify-content: space-between;
37
+ padding: 16px 20px;
38
+ border-bottom: 1px solid #e2e8f0;
39
+ background: #f8fafc;
40
+ border-radius: 12px 12px 0 0;
41
+ }
42
+
43
+ .popover-title {
44
+ font-size: 16px;
45
+ font-weight: 600;
46
+ color: #1e293b;
47
+ }
48
+
49
+ .close-btn {
50
+ width: 32px;
51
+ height: 32px;
52
+ line-height: 32px;
53
+
54
+ mat-icon {
55
+ font-size: 20px;
56
+ width: 20px;
57
+ height: 20px;
58
+ }
59
+ }
60
+
61
+ .popover-content {
62
+ padding: 20px;
63
+ max-height: 500px;
64
+ overflow-y: auto;
65
+ }
66
+
67
+ .mapping-info {
68
+ background: #f1f5f9;
69
+ border-radius: 8px;
70
+ padding: 12px 16px;
71
+ margin-bottom: 16px;
72
+ }
73
+
74
+ .info-row {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: 8px;
78
+
79
+ & + & {
80
+ margin-top: 8px;
81
+ }
82
+ }
83
+
84
+ .info-label {
85
+ font-size: 12px;
86
+ font-weight: 600;
87
+ color: #64748b;
88
+ text-transform: uppercase;
89
+ letter-spacing: 0.5px;
90
+ width: 60px;
91
+ }
92
+
93
+ .info-value {
94
+ font-size: 14px;
95
+ color: #1e293b;
96
+ font-weight: 500;
97
+ }
98
+
99
+ .full-width {
100
+ width: 100%;
101
+ }
102
+
103
+ .config-section {
104
+ margin-top: 12px;
105
+ }
106
+
107
+ .or-divider {
108
+ text-align: center;
109
+ font-size: 11px;
110
+ color: #94a3b8;
111
+ margin: 8px 0;
112
+ }
113
+
114
+ // Condition section in step config
115
+ .condition-section {
116
+ margin-top: 16px;
117
+ padding-top: 12px;
118
+ border-top: 1px dashed #e2e8f0;
119
+ }
120
+
121
+ .condition-checkbox {
122
+ font-size: 13px;
123
+ color: #64748b;
124
+ }
125
+
126
+ .condition-content {
127
+ margin-top: 12px;
128
+ }
129
+
130
+ .config-row {
131
+ display: flex;
132
+ gap: 12px;
133
+
134
+ mat-form-field {
135
+ flex: 1;
136
+ }
137
+ }
138
+
139
+ .preview-section {
140
+ margin-top: 16px;
141
+ padding: 12px 16px;
142
+ background: linear-gradient(135deg, #eff6ff 0%, #f0fdf4 100%);
143
+ border-radius: 8px;
144
+ border: 1px solid #e0e7ff;
145
+ }
146
+
147
+ .preview-label {
148
+ font-size: 11px;
149
+ font-weight: 600;
150
+ color: #6366f1;
151
+ text-transform: uppercase;
152
+ letter-spacing: 0.5px;
153
+ display: block;
154
+ margin-bottom: 6px;
155
+ }
156
+
157
+ .preview-value {
158
+ font-size: 14px;
159
+ color: #1e293b;
160
+ font-family: 'Monaco', 'Menlo', monospace;
161
+ word-break: break-all;
162
+ min-height: 20px;
163
+ }
164
+
165
+ // Multi-step transformation styles
166
+ .steps-container {
167
+ display: flex;
168
+ flex-direction: column;
169
+ gap: 12px;
170
+ }
171
+
172
+ .step-card {
173
+ background: #f8fafc;
174
+ border: 1px solid #e2e8f0;
175
+ border-radius: 8px;
176
+ overflow: hidden;
177
+ transition: all 0.2s ease;
178
+
179
+ &.expanded {
180
+ border-color: #6366f1;
181
+ border-width: 2px;
182
+ background: white;
183
+ }
184
+ }
185
+
186
+ // Collapsed step view
187
+ .step-collapsed {
188
+ display: grid;
189
+ grid-template-columns: auto 1fr;
190
+ gap: 0 12px;
191
+ padding: 12px;
192
+ cursor: pointer;
193
+ transition: background 0.15s ease;
194
+
195
+ &:hover {
196
+ background: #f1f5f9;
197
+ }
198
+
199
+ .drag-handle {
200
+ grid-row: span 2;
201
+ align-self: center;
202
+ }
203
+ }
204
+
205
+ .step-collapsed-header {
206
+ display: flex;
207
+ align-items: center;
208
+ flex-wrap: wrap;
209
+ gap: 4px;
210
+
211
+ .step-title-row {
212
+ display: flex;
213
+ align-items: center;
214
+ gap: 8px;
215
+ flex: 1;
216
+ }
217
+
218
+ .step-number {
219
+ flex-shrink: 0;
220
+ }
221
+ }
222
+
223
+ .condition-badge {
224
+ display: inline-flex;
225
+ align-items: center;
226
+ gap: 2px;
227
+ padding: 2px 6px;
228
+ background: #fef3c7;
229
+ border: 1px solid #f59e0b;
230
+ border-radius: 4px;
231
+ font-size: 10px;
232
+ font-weight: 600;
233
+ color: #b45309;
234
+ cursor: help;
235
+
236
+ mat-icon {
237
+ font-size: 12px;
238
+ width: 12px;
239
+ height: 12px;
240
+ }
241
+ }
242
+
243
+ .step-collapsed-actions {
244
+ display: flex;
245
+ align-items: center;
246
+ gap: 4px;
247
+ }
248
+
249
+ .step-collapsed-preview {
250
+ display: flex;
251
+ align-items: center;
252
+ gap: 8px;
253
+ margin-top: 8px;
254
+ font-size: 12px;
255
+ font-family: 'Monaco', 'Menlo', monospace;
256
+ }
257
+
258
+ .step-input {
259
+ color: #64748b;
260
+ max-width: 100px;
261
+ overflow: hidden;
262
+ text-overflow: ellipsis;
263
+ white-space: nowrap;
264
+ }
265
+
266
+ .arrow-icon {
267
+ font-size: 14px;
268
+ width: 14px;
269
+ height: 14px;
270
+ color: #6366f1;
271
+ }
272
+
273
+ .step-output {
274
+ color: #059669;
275
+ font-weight: 500;
276
+ max-width: 100px;
277
+ overflow: hidden;
278
+ text-overflow: ellipsis;
279
+ white-space: nowrap;
280
+ }
281
+
282
+ // Expanded step view
283
+ .step-expanded {
284
+ display: grid;
285
+ grid-template-columns: auto 1fr;
286
+ gap: 0 12px;
287
+ padding: 12px;
288
+
289
+ .drag-handle {
290
+ grid-row: 1;
291
+ align-self: center;
292
+ }
293
+
294
+ .step-header {
295
+ grid-column: 2;
296
+ }
297
+
298
+ .step-content {
299
+ grid-column: 2;
300
+ }
301
+
302
+ .step-preview {
303
+ grid-column: 2;
304
+ }
305
+ }
306
+
307
+ .step-header {
308
+ display: flex;
309
+ align-items: center;
310
+ margin-bottom: 12px;
311
+
312
+ .step-number {
313
+ flex: 1;
314
+ }
315
+ }
316
+
317
+ .step-header-actions {
318
+ display: flex;
319
+ align-items: center;
320
+ gap: 4px;
321
+ }
322
+
323
+ .step-number {
324
+ font-size: 12px;
325
+ font-weight: 600;
326
+ color: #6366f1;
327
+ text-transform: uppercase;
328
+ letter-spacing: 0.5px;
329
+ }
330
+
331
+ .expand-btn,
332
+ .collapse-btn {
333
+ width: 28px;
334
+ height: 28px;
335
+ line-height: 28px;
336
+
337
+ mat-icon {
338
+ font-size: 18px;
339
+ width: 18px;
340
+ height: 18px;
341
+ color: #64748b;
342
+ }
343
+
344
+ &:hover mat-icon {
345
+ color: #6366f1;
346
+ }
347
+ }
348
+
349
+ .remove-step-btn {
350
+ width: 28px;
351
+ height: 28px;
352
+ line-height: 28px;
353
+
354
+ mat-icon {
355
+ font-size: 18px;
356
+ width: 18px;
357
+ height: 18px;
358
+ color: #94a3b8;
359
+ }
360
+
361
+ &:hover mat-icon {
362
+ color: #ef4444;
363
+ }
364
+ }
365
+
366
+ .step-preview {
367
+ display: flex;
368
+ align-items: center;
369
+ gap: 8px;
370
+ margin-top: 12px;
371
+ padding: 8px 12px;
372
+ background: #f1f5f9;
373
+ border-radius: 6px;
374
+ }
375
+
376
+ .preview-arrow {
377
+ font-size: 16px;
378
+ width: 16px;
379
+ height: 16px;
380
+ color: #6366f1;
381
+ }
382
+
383
+ .step-preview-value {
384
+ font-size: 13px;
385
+ color: #475569;
386
+ font-family: 'Monaco', 'Menlo', monospace;
387
+ word-break: break-all;
388
+ flex: 1;
389
+ }
390
+
391
+ .add-step-section {
392
+ padding: 12px 20px;
393
+ border-top: 1px solid #e2e8f0;
394
+ background: #fafafa;
395
+ }
396
+
397
+ .add-step-btn {
398
+ width: 100%;
399
+ border-style: dashed;
400
+ color: #64748b;
401
+
402
+ mat-icon {
403
+ font-size: 18px;
404
+ width: 18px;
405
+ height: 18px;
406
+ margin-right: 4px;
407
+ }
408
+
409
+ &:hover {
410
+ border-color: #6366f1;
411
+ color: #6366f1;
412
+ background: #f5f3ff;
413
+ }
414
+ }
415
+
416
+ .final-preview {
417
+ margin-top: 16px;
418
+ background: linear-gradient(135deg, #ecfdf5 0%, #d1fae5 100%);
419
+ border: 2px solid #10b981;
420
+ border-radius: 8px;
421
+ position: relative;
422
+
423
+ .preview-label {
424
+ color: #059669;
425
+ font-size: 12px;
426
+ font-weight: 700;
427
+ }
428
+
429
+ .preview-value {
430
+ color: #065f46;
431
+ font-weight: 600;
432
+ }
433
+
434
+ &::before {
435
+ content: '✓';
436
+ position: absolute;
437
+ right: 12px;
438
+ top: 10px;
439
+ color: #10b981;
440
+ font-size: 16px;
441
+ font-weight: bold;
442
+ }
443
+ }
444
+
445
+ .popover-actions {
446
+ display: flex;
447
+ align-items: center;
448
+ gap: 8px;
449
+ padding: 16px 20px;
450
+ border-top: 1px solid #e2e8f0;
451
+ background: #f8fafc;
452
+ border-radius: 0 0 12px 12px;
453
+ }
454
+
455
+ .action-spacer {
456
+ flex: 1;
457
+ }
458
+
459
+ // Material overrides for this component
460
+ ::ng-deep .transformation-popover {
461
+ .mat-mdc-form-field {
462
+ font-size: 14px;
463
+ }
464
+
465
+ .mat-mdc-text-field-wrapper {
466
+ background: white;
467
+ }
468
+
469
+ .mat-mdc-form-field-subscript-wrapper {
470
+ font-size: 11px;
471
+ }
472
+ }
473
+
474
+ // Drag handle styles
475
+ .drag-handle {
476
+ cursor: grab;
477
+ color: #94a3b8;
478
+ font-size: 20px;
479
+ width: 20px;
480
+ height: 20px;
481
+ flex-shrink: 0;
482
+
483
+ &:hover {
484
+ color: #6366f1;
485
+ }
486
+
487
+ &:active {
488
+ cursor: grabbing;
489
+ }
490
+ }
491
+
492
+ // CDK Drag-drop styles
493
+ .step-card.cdk-drag-preview {
494
+ box-shadow: 0 5px 20px rgba(0, 0, 0, 0.25);
495
+ border-radius: 8px;
496
+ background: white;
497
+ }
498
+
499
+ .step-card.cdk-drag-placeholder {
500
+ opacity: 0.4;
501
+ background: #e2e8f0;
502
+ border: 2px dashed #94a3b8;
503
+ }
504
+
505
+ .step-card.cdk-drag-animating {
506
+ transition: transform 200ms ease;
507
+ }
508
+
509
+ .steps-container.cdk-drop-list-dragging .step-card:not(.cdk-drag-placeholder) {
510
+ transition: transform 200ms ease;
511
+ }