@payloadcms/ui 3.80.0-internal.cee0ccf → 3.80.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 (61) hide show
  1. package/dist/elements/BulkUpload/FormsManager/index.d.ts.map +1 -1
  2. package/dist/elements/BulkUpload/FormsManager/index.js +29 -7
  3. package/dist/elements/BulkUpload/FormsManager/index.js.map +1 -1
  4. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.d.ts.map +1 -1
  5. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js +53 -3
  6. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.js.map +1 -1
  7. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js +541 -0
  8. package/dist/elements/ClipboardAction/mergeFormStateFromClipboard.spec.js.map +1 -0
  9. package/dist/elements/Combobox/index.d.ts.map +1 -1
  10. package/dist/elements/Combobox/index.js +1 -0
  11. package/dist/elements/Combobox/index.js.map +1 -1
  12. package/dist/elements/Link/index.d.ts.map +1 -1
  13. package/dist/elements/LivePreview/Window/index.d.ts.map +1 -1
  14. package/dist/elements/LivePreview/Window/index.js +9 -7
  15. package/dist/elements/LivePreview/Window/index.js.map +1 -1
  16. package/dist/elements/PublishButton/index.d.ts.map +1 -1
  17. package/dist/elements/PublishButton/index.js +3 -1
  18. package/dist/elements/PublishButton/index.js.map +1 -1
  19. package/dist/elements/RelationshipTable/index.d.ts.map +1 -1
  20. package/dist/elements/RelationshipTable/index.js +14 -9
  21. package/dist/elements/RelationshipTable/index.js.map +1 -1
  22. package/dist/elements/Toasts/fieldErrors.d.ts +4 -0
  23. package/dist/elements/Toasts/fieldErrors.d.ts.map +1 -1
  24. package/dist/elements/Toasts/fieldErrors.js +4 -2
  25. package/dist/elements/Toasts/fieldErrors.js.map +1 -1
  26. package/dist/elements/Toasts/fieldErrors.spec.js +46 -0
  27. package/dist/elements/Toasts/fieldErrors.spec.js.map +1 -0
  28. package/dist/elements/WhereBuilder/Condition/Relationship/index.d.ts.map +1 -1
  29. package/dist/elements/WhereBuilder/Condition/Relationship/index.js +8 -6
  30. package/dist/elements/WhereBuilder/Condition/Relationship/index.js.map +1 -1
  31. package/dist/elements/WhereBuilder/field-types.d.ts.map +1 -1
  32. package/dist/elements/WhereBuilder/field-types.js +2 -5
  33. package/dist/elements/WhereBuilder/field-types.js.map +1 -1
  34. package/dist/exports/client/{DatePicker-CL2EGBVQ.js → DatePicker-T2DMDMM5.js} +2 -2
  35. package/dist/exports/client/chunk-WDZJLNNB.js +29 -0
  36. package/dist/exports/client/{chunk-SH42NW5R.js.map → chunk-WDZJLNNB.js.map} +4 -4
  37. package/dist/exports/client/index.d.ts +1 -1
  38. package/dist/exports/client/index.d.ts.map +1 -1
  39. package/dist/exports/client/index.js +24 -24
  40. package/dist/exports/client/index.js.map +4 -4
  41. package/dist/fields/Blocks/BlockSelector/index.scss +4 -4
  42. package/dist/fields/shared/index.d.ts +2 -2
  43. package/dist/fields/shared/index.d.ts.map +1 -1
  44. package/dist/fields/shared/index.js.map +1 -1
  45. package/dist/forms/Form/mergeServerFormState.d.ts.map +1 -1
  46. package/dist/forms/Form/mergeServerFormState.js +101 -24
  47. package/dist/forms/Form/mergeServerFormState.js.map +1 -1
  48. package/dist/providers/LivePreview/context.d.ts +6 -0
  49. package/dist/providers/LivePreview/context.d.ts.map +1 -1
  50. package/dist/providers/LivePreview/context.js +1 -0
  51. package/dist/providers/LivePreview/context.js.map +1 -1
  52. package/dist/providers/LivePreview/index.d.ts.map +1 -1
  53. package/dist/providers/LivePreview/index.js +13 -1
  54. package/dist/providers/LivePreview/index.js.map +1 -1
  55. package/dist/styles.css +1 -1
  56. package/dist/views/Edit/index.d.ts.map +1 -1
  57. package/dist/views/Edit/index.js +15 -2
  58. package/dist/views/Edit/index.js.map +1 -1
  59. package/package.json +4 -4
  60. package/dist/exports/client/chunk-SH42NW5R.js +0 -29
  61. /package/dist/exports/client/{DatePicker-CL2EGBVQ.js.map → DatePicker-T2DMDMM5.js.map} +0 -0
@@ -0,0 +1,541 @@
1
+ import ObjectIdImport from 'bson-objectid';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { mergeFormStateFromClipboard } from './mergeFormStateFromClipboard.js';
4
+ const ObjectId = 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport;
5
+ describe('mergeFormStateFromClipboard', () => {
6
+ describe('block ID regeneration', () => {
7
+ it('should generate new IDs when pasting blocks to prevent duplicates', () => {
8
+ const copiedBlockID = new ObjectId().toHexString();
9
+ const formState = {
10
+ layout: {
11
+ valid: true,
12
+ value: 0,
13
+ initialValue: 0,
14
+ rows: []
15
+ }
16
+ };
17
+ const clipboardData = {
18
+ type: 'blocks',
19
+ path: 'layout',
20
+ blocks: [],
21
+ data: {
22
+ 'layout.0.id': {
23
+ value: copiedBlockID,
24
+ valid: true
25
+ },
26
+ 'layout.0.blockType': {
27
+ value: 'content',
28
+ valid: true
29
+ },
30
+ 'layout.0.text': {
31
+ value: 'test content',
32
+ valid: true
33
+ }
34
+ },
35
+ rowIndex: 0
36
+ };
37
+ const result = mergeFormStateFromClipboard({
38
+ dataFromClipboard: clipboardData,
39
+ formState,
40
+ path: 'layout'
41
+ });
42
+ // Check that a new ID was generated
43
+ expect(result['layout.0.id']).toBeDefined();
44
+ expect(result['layout.0.id'].value).toBeDefined();
45
+ expect(result['layout.0.id'].value).not.toEqual(copiedBlockID);
46
+ expect(ObjectId.isValid(result['layout.0.id'].value)).toBe(true);
47
+ // Check that the row metadata also has the new ID
48
+ expect(result.layout.rows).toHaveLength(1);
49
+ expect(result.layout.rows?.[0]?.id).not.toEqual(copiedBlockID);
50
+ expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value);
51
+ });
52
+ it('should generate new IDs for nested blocks', () => {
53
+ const copiedBlockID = new ObjectId().toHexString();
54
+ const copiedNestedBlockID = new ObjectId().toHexString();
55
+ const formState = {
56
+ layout: {
57
+ valid: true,
58
+ value: 0,
59
+ initialValue: 0,
60
+ rows: []
61
+ }
62
+ };
63
+ const clipboardData = {
64
+ type: 'blocks',
65
+ path: 'layout',
66
+ blocks: [],
67
+ data: {
68
+ 'layout.0.id': {
69
+ value: copiedBlockID,
70
+ valid: true
71
+ },
72
+ 'layout.0.blockType': {
73
+ value: 'container',
74
+ valid: true
75
+ },
76
+ 'layout.0.subBlocks': {
77
+ value: 1,
78
+ valid: true,
79
+ rows: [{
80
+ id: copiedNestedBlockID
81
+ }]
82
+ },
83
+ 'layout.0.subBlocks.0.id': {
84
+ value: copiedNestedBlockID,
85
+ valid: true
86
+ },
87
+ 'layout.0.subBlocks.0.blockType': {
88
+ value: 'content',
89
+ valid: true
90
+ }
91
+ },
92
+ rowIndex: 0
93
+ };
94
+ const result = mergeFormStateFromClipboard({
95
+ dataFromClipboard: clipboardData,
96
+ formState,
97
+ path: 'layout'
98
+ });
99
+ // Check that parent block got new ID
100
+ expect(result['layout.0.id'].value).not.toEqual(copiedBlockID);
101
+ expect(ObjectId.isValid(result['layout.0.id'].value)).toBe(true);
102
+ // Check that nested block got new ID
103
+ expect(result['layout.0.subBlocks.0.id'].value).not.toEqual(copiedNestedBlockID);
104
+ expect(ObjectId.isValid(result['layout.0.subBlocks.0.id'].value)).toBe(true);
105
+ // Check that parent and nested IDs are different
106
+ expect(result['layout.0.id'].value).not.toEqual(result['layout.0.subBlocks.0.id'].value);
107
+ // Check that parent row metadata has new ID
108
+ expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value);
109
+ // Check that nested row metadata has new ID
110
+ expect(result['layout.0.subBlocks'].rows?.[0]?.id).toEqual(result['layout.0.subBlocks.0.id'].value);
111
+ });
112
+ it('should preserve non-ID field values when pasting', () => {
113
+ const copiedBlockID = new ObjectId().toHexString();
114
+ const formState = {
115
+ layout: {
116
+ valid: true,
117
+ value: 0,
118
+ initialValue: 0,
119
+ rows: []
120
+ }
121
+ };
122
+ const clipboardData = {
123
+ type: 'blocks',
124
+ path: 'layout',
125
+ blocks: [],
126
+ data: {
127
+ 'layout.0.id': {
128
+ value: copiedBlockID,
129
+ valid: true
130
+ },
131
+ 'layout.0.blockType': {
132
+ value: 'content',
133
+ valid: true
134
+ },
135
+ 'layout.0.text': {
136
+ value: 'preserved text content',
137
+ valid: true
138
+ }
139
+ },
140
+ rowIndex: 0
141
+ };
142
+ const result = mergeFormStateFromClipboard({
143
+ dataFromClipboard: clipboardData,
144
+ formState,
145
+ path: 'layout'
146
+ });
147
+ // Non-ID fields should be preserved
148
+ expect(result['layout.0.blockType'].value).toEqual('content');
149
+ expect(result['layout.0.text'].value).toEqual('preserved text content');
150
+ });
151
+ it('should generate new ID when pasting from row to field', () => {
152
+ const copiedBlockID = new ObjectId().toHexString();
153
+ const formState = {
154
+ duplicate: {
155
+ valid: true,
156
+ value: 0,
157
+ initialValue: 0,
158
+ rows: []
159
+ }
160
+ };
161
+ // Simulating copying from blocks.1 and pasting into duplicate field
162
+ const clipboardData = {
163
+ type: 'blocks',
164
+ path: 'blocks',
165
+ blocks: [],
166
+ data: {
167
+ 'blocks.1.id': {
168
+ value: copiedBlockID,
169
+ valid: true
170
+ },
171
+ 'blocks.1.blockType': {
172
+ value: 'number',
173
+ valid: true
174
+ },
175
+ 'blocks.1.number': {
176
+ value: 342,
177
+ valid: true
178
+ }
179
+ },
180
+ rowIndex: 1
181
+ };
182
+ const result = mergeFormStateFromClipboard({
183
+ dataFromClipboard: clipboardData,
184
+ formState,
185
+ path: 'duplicate'
186
+ });
187
+ // Check that a new ID was generated
188
+ expect(result['duplicate.0.id']).toBeDefined();
189
+ expect(result['duplicate.0.id'].value).toBeDefined();
190
+ expect(result['duplicate.0.id'].value).not.toEqual(copiedBlockID);
191
+ expect(ObjectId.isValid(result['duplicate.0.id'].value)).toBe(true);
192
+ // Check that the row metadata has the new ID (not the copied ID)
193
+ expect(result.duplicate.rows).toBeDefined();
194
+ expect(result.duplicate.rows).toHaveLength(1);
195
+ expect(result.duplicate.rows[0].id).not.toEqual(copiedBlockID);
196
+ expect(result.duplicate.rows[0].id).toEqual(result['duplicate.0.id'].value);
197
+ // Check that other fields were preserved
198
+ expect(result['duplicate.0.number'].value).toEqual(342);
199
+ });
200
+ });
201
+ describe('block row paste with nested array', () => {
202
+ it('should regenerate nested array item IDs when pasting a block row', () => {
203
+ const copiedBlockID = new ObjectId().toHexString();
204
+ const copiedArrayItemID1 = new ObjectId().toHexString();
205
+ const copiedArrayItemID2 = new ObjectId().toHexString();
206
+ const copiedArrayItemID3 = new ObjectId().toHexString();
207
+ const targetBlockID = new ObjectId().toHexString();
208
+ // Target form state: block at index 1 with empty buttons array
209
+ const formState = {
210
+ ctas: {
211
+ valid: true,
212
+ value: 2,
213
+ initialValue: 2,
214
+ rows: [{
215
+ id: copiedBlockID,
216
+ blockType: 'callToAction',
217
+ isLoading: false
218
+ }, {
219
+ id: targetBlockID,
220
+ blockType: 'callToAction',
221
+ isLoading: false
222
+ }]
223
+ },
224
+ 'ctas.0': {
225
+ value: 'callToAction',
226
+ valid: true
227
+ },
228
+ 'ctas.0.id': {
229
+ value: copiedBlockID,
230
+ valid: true
231
+ },
232
+ 'ctas.0.buttons': {
233
+ valid: true,
234
+ value: 3,
235
+ rows: [{
236
+ id: copiedArrayItemID1,
237
+ isLoading: false
238
+ }, {
239
+ id: copiedArrayItemID2,
240
+ isLoading: false
241
+ }, {
242
+ id: copiedArrayItemID3,
243
+ isLoading: false
244
+ }]
245
+ },
246
+ 'ctas.0.buttons.0.id': {
247
+ value: copiedArrayItemID1,
248
+ valid: true
249
+ },
250
+ 'ctas.0.buttons.1.id': {
251
+ value: copiedArrayItemID2,
252
+ valid: true
253
+ },
254
+ 'ctas.0.buttons.2.id': {
255
+ value: copiedArrayItemID3,
256
+ valid: true
257
+ },
258
+ 'ctas.1': {
259
+ value: 'callToAction',
260
+ valid: true
261
+ },
262
+ 'ctas.1.id': {
263
+ value: targetBlockID,
264
+ valid: true
265
+ },
266
+ 'ctas.1.buttons': {
267
+ valid: true,
268
+ value: 0,
269
+ rows: []
270
+ }
271
+ };
272
+ // Clipboard: block row 0 (source) with 3 buttons
273
+ const clipboardData = {
274
+ type: 'blocks',
275
+ path: 'ctas',
276
+ blocks: [],
277
+ rowIndex: 0,
278
+ data: {
279
+ 'ctas.0': {
280
+ value: 'callToAction',
281
+ valid: true
282
+ },
283
+ 'ctas.0.id': {
284
+ value: copiedBlockID,
285
+ valid: true
286
+ },
287
+ 'ctas.0.buttons': {
288
+ valid: true,
289
+ value: 3,
290
+ rows: [{
291
+ id: copiedArrayItemID1,
292
+ isLoading: false
293
+ }, {
294
+ id: copiedArrayItemID2,
295
+ isLoading: false
296
+ }, {
297
+ id: copiedArrayItemID3,
298
+ isLoading: false
299
+ }]
300
+ },
301
+ 'ctas.0.buttons.0.id': {
302
+ value: copiedArrayItemID1,
303
+ valid: true
304
+ },
305
+ 'ctas.0.buttons.0.label': {
306
+ value: 'Button 1',
307
+ valid: true
308
+ },
309
+ 'ctas.0.buttons.1.id': {
310
+ value: copiedArrayItemID2,
311
+ valid: true
312
+ },
313
+ 'ctas.0.buttons.1.label': {
314
+ value: 'Button 2',
315
+ valid: true
316
+ },
317
+ 'ctas.0.buttons.2.id': {
318
+ value: copiedArrayItemID3,
319
+ valid: true
320
+ },
321
+ 'ctas.0.buttons.2.label': {
322
+ value: 'Button 3',
323
+ valid: true
324
+ }
325
+ }
326
+ };
327
+ // Paste into block row 1 (target)
328
+ const result = mergeFormStateFromClipboard({
329
+ dataFromClipboard: clipboardData,
330
+ formState,
331
+ path: 'ctas',
332
+ rowIndex: 1
333
+ });
334
+ // Target block ID should NOT be overwritten
335
+ expect(result['ctas.1.id'].value).toEqual(targetBlockID);
336
+ // Nested array items should have NEW IDs (not the source IDs)
337
+ expect(result['ctas.1.buttons.0.id']).toBeDefined();
338
+ expect(result['ctas.1.buttons.0.id'].value).not.toEqual(copiedArrayItemID1);
339
+ expect(ObjectId.isValid(result['ctas.1.buttons.0.id'].value)).toBe(true);
340
+ expect(result['ctas.1.buttons.1.id']).toBeDefined();
341
+ expect(result['ctas.1.buttons.1.id'].value).not.toEqual(copiedArrayItemID2);
342
+ expect(result['ctas.1.buttons.2.id']).toBeDefined();
343
+ expect(result['ctas.1.buttons.2.id'].value).not.toEqual(copiedArrayItemID3);
344
+ // The rows metadata in ctas.1.buttons should have the new IDs
345
+ expect(result['ctas.1.buttons'].rows).toHaveLength(3);
346
+ expect(result['ctas.1.buttons'].rows[0].id).toEqual(result['ctas.1.buttons.0.id'].value);
347
+ expect(result['ctas.1.buttons'].rows[1].id).toEqual(result['ctas.1.buttons.1.id'].value);
348
+ expect(result['ctas.1.buttons'].rows[2].id).toEqual(result['ctas.1.buttons.2.id'].value);
349
+ // Field values should be copied
350
+ expect(result['ctas.1.buttons.0.label'].value).toEqual('Button 1');
351
+ expect(result['ctas.1.buttons.1.label'].value).toEqual('Button 2');
352
+ expect(result['ctas.1.buttons.2.label'].value).toEqual('Button 3');
353
+ // Source block should be untouched
354
+ expect(result['ctas.0.id'].value).toEqual(copiedBlockID);
355
+ expect(result['ctas.0.buttons'].rows).toHaveLength(3);
356
+ });
357
+ });
358
+ describe('array ID regeneration', () => {
359
+ it('should generate new IDs when pasting arrays to prevent duplicates', () => {
360
+ const copiedArrayID = new ObjectId().toHexString();
361
+ const formState = {
362
+ items: {
363
+ valid: true,
364
+ value: 0,
365
+ initialValue: 0,
366
+ rows: []
367
+ }
368
+ };
369
+ const clipboardData = {
370
+ type: 'array',
371
+ path: 'items',
372
+ fields: [],
373
+ data: {
374
+ 'items.0.id': {
375
+ value: copiedArrayID,
376
+ valid: true
377
+ },
378
+ 'items.0.text': {
379
+ value: 'test content',
380
+ valid: true
381
+ }
382
+ },
383
+ rowIndex: 0
384
+ };
385
+ const result = mergeFormStateFromClipboard({
386
+ dataFromClipboard: clipboardData,
387
+ formState,
388
+ path: 'items'
389
+ });
390
+ // Check that a new ID was generated
391
+ expect(result['items.0.id']).toBeDefined();
392
+ expect(result['items.0.id'].value).toBeDefined();
393
+ expect(result['items.0.id'].value).not.toEqual(copiedArrayID);
394
+ expect(ObjectId.isValid(result['items.0.id'].value)).toBe(true);
395
+ // Check that the row metadata also has the new ID
396
+ expect(result.items.rows).toHaveLength(1);
397
+ expect(result.items.rows?.[0]?.id).not.toEqual(copiedArrayID);
398
+ expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value);
399
+ });
400
+ it('should generate new IDs for nested arrays', () => {
401
+ const copiedArrayID = new ObjectId().toHexString();
402
+ const copiedNestedArrayID = new ObjectId().toHexString();
403
+ const formState = {
404
+ items: {
405
+ valid: true,
406
+ value: 0,
407
+ initialValue: 0,
408
+ rows: []
409
+ }
410
+ };
411
+ const clipboardData = {
412
+ type: 'array',
413
+ path: 'items',
414
+ fields: [],
415
+ data: {
416
+ 'items.0.id': {
417
+ value: copiedArrayID,
418
+ valid: true
419
+ },
420
+ 'items.0.text': {
421
+ value: 'parent array',
422
+ valid: true
423
+ },
424
+ 'items.0.subArray': {
425
+ value: 1,
426
+ valid: true,
427
+ rows: [{
428
+ id: copiedNestedArrayID
429
+ }]
430
+ },
431
+ 'items.0.subArray.0.id': {
432
+ value: copiedNestedArrayID,
433
+ valid: true
434
+ },
435
+ 'items.0.subArray.0.text': {
436
+ value: 'nested array',
437
+ valid: true
438
+ }
439
+ },
440
+ rowIndex: 0
441
+ };
442
+ const result = mergeFormStateFromClipboard({
443
+ dataFromClipboard: clipboardData,
444
+ formState,
445
+ path: 'items'
446
+ });
447
+ // Check that parent array got new ID
448
+ expect(result['items.0.id'].value).not.toEqual(copiedArrayID);
449
+ expect(ObjectId.isValid(result['items.0.id'].value)).toBe(true);
450
+ // Check that nested array got new ID
451
+ expect(result['items.0.subArray.0.id'].value).not.toEqual(copiedNestedArrayID);
452
+ expect(ObjectId.isValid(result['items.0.subArray.0.id'].value)).toBe(true);
453
+ // Check that parent and nested IDs are different
454
+ expect(result['items.0.id'].value).not.toEqual(result['items.0.subArray.0.id'].value);
455
+ // Check that parent row metadata has new ID
456
+ expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value);
457
+ // Check that nested row metadata has new ID
458
+ expect(result['items.0.subArray'].rows?.[0]?.id).toEqual(result['items.0.subArray.0.id'].value);
459
+ });
460
+ it('should preserve non-ID field values when pasting arrays', () => {
461
+ const copiedArrayID = new ObjectId().toHexString();
462
+ const formState = {
463
+ items: {
464
+ valid: true,
465
+ value: 0,
466
+ initialValue: 0,
467
+ rows: []
468
+ }
469
+ };
470
+ const clipboardData = {
471
+ type: 'array',
472
+ path: 'items',
473
+ fields: [],
474
+ data: {
475
+ 'items.0.id': {
476
+ value: copiedArrayID,
477
+ valid: true
478
+ },
479
+ 'items.0.text': {
480
+ value: 'preserved array text',
481
+ valid: true
482
+ }
483
+ },
484
+ rowIndex: 0
485
+ };
486
+ const result = mergeFormStateFromClipboard({
487
+ dataFromClipboard: clipboardData,
488
+ formState,
489
+ path: 'items'
490
+ });
491
+ // Non-ID fields should be preserved
492
+ expect(result['items.0.text'].value).toEqual('preserved array text');
493
+ });
494
+ it('should generate new ID when pasting from array row to field', () => {
495
+ const copiedArrayID = new ObjectId().toHexString();
496
+ const formState = {
497
+ disableSort: {
498
+ valid: true,
499
+ value: 0,
500
+ initialValue: 0,
501
+ rows: []
502
+ }
503
+ };
504
+ // Simulating copying from items.0 and pasting into disableSort field
505
+ const clipboardData = {
506
+ type: 'array',
507
+ path: 'items',
508
+ fields: [],
509
+ data: {
510
+ 'items.0.id': {
511
+ value: copiedArrayID,
512
+ valid: true
513
+ },
514
+ 'items.0.text': {
515
+ value: 'row one',
516
+ valid: true
517
+ }
518
+ },
519
+ rowIndex: 0
520
+ };
521
+ const result = mergeFormStateFromClipboard({
522
+ dataFromClipboard: clipboardData,
523
+ formState,
524
+ path: 'disableSort'
525
+ });
526
+ // Check that a new ID was generated
527
+ expect(result['disableSort.0.id']).toBeDefined();
528
+ expect(result['disableSort.0.id'].value).toBeDefined();
529
+ expect(result['disableSort.0.id'].value).not.toEqual(copiedArrayID);
530
+ expect(ObjectId.isValid(result['disableSort.0.id'].value)).toBe(true);
531
+ // Check that the row metadata has the new ID (not the copied ID)
532
+ expect(result.disableSort.rows).toBeDefined();
533
+ expect(result.disableSort.rows).toHaveLength(1);
534
+ expect(result.disableSort.rows[0].id).not.toEqual(copiedArrayID);
535
+ expect(result.disableSort.rows[0].id).toEqual(result['disableSort.0.id'].value);
536
+ // Check that other fields were preserved
537
+ expect(result['disableSort.0.text'].value).toEqual('row one');
538
+ });
539
+ });
540
+ });
541
+ //# sourceMappingURL=mergeFormStateFromClipboard.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeFormStateFromClipboard.spec.js","names":["ObjectIdImport","describe","expect","it","mergeFormStateFromClipboard","ObjectId","default","copiedBlockID","toHexString","formState","layout","valid","value","initialValue","rows","clipboardData","type","path","blocks","data","rowIndex","result","dataFromClipboard","toBeDefined","not","toEqual","isValid","toBe","toHaveLength","id","copiedNestedBlockID","duplicate","copiedArrayItemID1","copiedArrayItemID2","copiedArrayItemID3","targetBlockID","ctas","blockType","isLoading","copiedArrayID","items","fields","copiedNestedArrayID","disableSort"],"sources":["../../../src/elements/ClipboardAction/mergeFormStateFromClipboard.spec.ts"],"sourcesContent":["import type { FormState } from 'payload'\n\nimport ObjectIdImport from 'bson-objectid'\nimport { describe, expect, it } from 'vitest'\n\nimport { mergeFormStateFromClipboard } from './mergeFormStateFromClipboard.js'\nimport type { ClipboardPasteData } from './types.js'\n\nconst ObjectId = (\n 'default' in ObjectIdImport ? ObjectIdImport.default : ObjectIdImport\n) as typeof ObjectIdImport\n\ndescribe('mergeFormStateFromClipboard', () => {\n describe('block ID regeneration', () => {\n it('should generate new IDs when pasting blocks to prevent duplicates', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'content',\n valid: true,\n },\n 'layout.0.text': {\n value: 'test content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Check that a new ID was generated\n expect(result['layout.0.id']).toBeDefined()\n expect(result['layout.0.id'].value).toBeDefined()\n expect(result['layout.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['layout.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata also has the new ID\n expect(result.layout.rows).toHaveLength(1)\n expect(result.layout.rows?.[0]?.id).not.toEqual(copiedBlockID)\n expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value)\n })\n\n it('should generate new IDs for nested blocks', () => {\n const copiedBlockID = new ObjectId().toHexString()\n const copiedNestedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'container',\n valid: true,\n },\n 'layout.0.subBlocks': {\n value: 1,\n valid: true,\n rows: [{ id: copiedNestedBlockID }],\n },\n 'layout.0.subBlocks.0.id': {\n value: copiedNestedBlockID,\n valid: true,\n },\n 'layout.0.subBlocks.0.blockType': {\n value: 'content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Check that parent block got new ID\n expect(result['layout.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['layout.0.id'].value as string)).toBe(true)\n\n // Check that nested block got new ID\n expect(result['layout.0.subBlocks.0.id'].value).not.toEqual(copiedNestedBlockID)\n expect(ObjectId.isValid(result['layout.0.subBlocks.0.id'].value as string)).toBe(true)\n\n // Check that parent and nested IDs are different\n expect(result['layout.0.id'].value).not.toEqual(result['layout.0.subBlocks.0.id'].value)\n\n // Check that parent row metadata has new ID\n expect(result.layout.rows?.[0]?.id).toEqual(result['layout.0.id'].value)\n\n // Check that nested row metadata has new ID\n expect(result['layout.0.subBlocks'].rows?.[0]?.id).toEqual(\n result['layout.0.subBlocks.0.id'].value,\n )\n })\n\n it('should preserve non-ID field values when pasting', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n layout: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'layout',\n blocks: [],\n data: {\n 'layout.0.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'layout.0.blockType': {\n value: 'content',\n valid: true,\n },\n 'layout.0.text': {\n value: 'preserved text content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'layout',\n })\n\n // Non-ID fields should be preserved\n expect(result['layout.0.blockType'].value).toEqual('content')\n expect(result['layout.0.text'].value).toEqual('preserved text content')\n })\n\n it('should generate new ID when pasting from row to field', () => {\n const copiedBlockID = new ObjectId().toHexString()\n\n const formState: FormState = {\n duplicate: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n // Simulating copying from blocks.1 and pasting into duplicate field\n const clipboardData = {\n type: 'blocks' as const,\n path: 'blocks',\n blocks: [],\n data: {\n 'blocks.1.id': {\n value: copiedBlockID,\n valid: true,\n },\n 'blocks.1.blockType': {\n value: 'number',\n valid: true,\n },\n 'blocks.1.number': {\n value: 342,\n valid: true,\n },\n },\n rowIndex: 1,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'duplicate',\n })\n\n // Check that a new ID was generated\n expect(result['duplicate.0.id']).toBeDefined()\n expect(result['duplicate.0.id'].value).toBeDefined()\n expect(result['duplicate.0.id'].value).not.toEqual(copiedBlockID)\n expect(ObjectId.isValid(result['duplicate.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata has the new ID (not the copied ID)\n expect(result.duplicate.rows).toBeDefined()\n expect(result.duplicate.rows).toHaveLength(1)\n expect(result.duplicate.rows![0].id).not.toEqual(copiedBlockID)\n expect(result.duplicate.rows![0].id).toEqual(result['duplicate.0.id'].value)\n\n // Check that other fields were preserved\n expect(result['duplicate.0.number'].value).toEqual(342)\n })\n })\n\n describe('block row paste with nested array', () => {\n it('should regenerate nested array item IDs when pasting a block row', () => {\n const copiedBlockID = new ObjectId().toHexString()\n const copiedArrayItemID1 = new ObjectId().toHexString()\n const copiedArrayItemID2 = new ObjectId().toHexString()\n const copiedArrayItemID3 = new ObjectId().toHexString()\n const targetBlockID = new ObjectId().toHexString()\n\n // Target form state: block at index 1 with empty buttons array\n const formState: FormState = {\n ctas: {\n valid: true,\n value: 2,\n initialValue: 2,\n rows: [\n { id: copiedBlockID, blockType: 'callToAction', isLoading: false },\n { id: targetBlockID, blockType: 'callToAction', isLoading: false },\n ],\n },\n 'ctas.0': { value: 'callToAction', valid: true },\n 'ctas.0.id': { value: copiedBlockID, valid: true },\n 'ctas.0.buttons': {\n valid: true,\n value: 3,\n rows: [\n { id: copiedArrayItemID1, isLoading: false },\n { id: copiedArrayItemID2, isLoading: false },\n { id: copiedArrayItemID3, isLoading: false },\n ],\n },\n 'ctas.0.buttons.0.id': { value: copiedArrayItemID1, valid: true },\n 'ctas.0.buttons.1.id': { value: copiedArrayItemID2, valid: true },\n 'ctas.0.buttons.2.id': { value: copiedArrayItemID3, valid: true },\n 'ctas.1': { value: 'callToAction', valid: true },\n 'ctas.1.id': { value: targetBlockID, valid: true },\n 'ctas.1.buttons': {\n valid: true,\n value: 0,\n rows: [],\n },\n }\n\n // Clipboard: block row 0 (source) with 3 buttons\n const clipboardData: ClipboardPasteData = {\n type: 'blocks',\n path: 'ctas',\n blocks: [],\n rowIndex: 0,\n data: {\n 'ctas.0': { value: 'callToAction', valid: true },\n 'ctas.0.id': { value: copiedBlockID, valid: true },\n 'ctas.0.buttons': {\n valid: true,\n value: 3,\n rows: [\n { id: copiedArrayItemID1, isLoading: false },\n { id: copiedArrayItemID2, isLoading: false },\n { id: copiedArrayItemID3, isLoading: false },\n ],\n },\n 'ctas.0.buttons.0.id': { value: copiedArrayItemID1, valid: true },\n 'ctas.0.buttons.0.label': { value: 'Button 1', valid: true },\n 'ctas.0.buttons.1.id': { value: copiedArrayItemID2, valid: true },\n 'ctas.0.buttons.1.label': { value: 'Button 2', valid: true },\n 'ctas.0.buttons.2.id': { value: copiedArrayItemID3, valid: true },\n 'ctas.0.buttons.2.label': { value: 'Button 3', valid: true },\n },\n }\n\n // Paste into block row 1 (target)\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'ctas',\n rowIndex: 1,\n })\n\n // Target block ID should NOT be overwritten\n expect(result['ctas.1.id'].value).toEqual(targetBlockID)\n\n // Nested array items should have NEW IDs (not the source IDs)\n expect(result['ctas.1.buttons.0.id']).toBeDefined()\n expect(result['ctas.1.buttons.0.id'].value).not.toEqual(copiedArrayItemID1)\n expect(ObjectId.isValid(result['ctas.1.buttons.0.id'].value as string)).toBe(true)\n\n expect(result['ctas.1.buttons.1.id']).toBeDefined()\n expect(result['ctas.1.buttons.1.id'].value).not.toEqual(copiedArrayItemID2)\n\n expect(result['ctas.1.buttons.2.id']).toBeDefined()\n expect(result['ctas.1.buttons.2.id'].value).not.toEqual(copiedArrayItemID3)\n\n // The rows metadata in ctas.1.buttons should have the new IDs\n expect(result['ctas.1.buttons'].rows).toHaveLength(3)\n expect(result['ctas.1.buttons'].rows![0].id).toEqual(result['ctas.1.buttons.0.id'].value)\n expect(result['ctas.1.buttons'].rows![1].id).toEqual(result['ctas.1.buttons.1.id'].value)\n expect(result['ctas.1.buttons'].rows![2].id).toEqual(result['ctas.1.buttons.2.id'].value)\n\n // Field values should be copied\n expect(result['ctas.1.buttons.0.label'].value).toEqual('Button 1')\n expect(result['ctas.1.buttons.1.label'].value).toEqual('Button 2')\n expect(result['ctas.1.buttons.2.label'].value).toEqual('Button 3')\n\n // Source block should be untouched\n expect(result['ctas.0.id'].value).toEqual(copiedBlockID)\n expect(result['ctas.0.buttons'].rows).toHaveLength(3)\n })\n })\n\n describe('array ID regeneration', () => {\n it('should generate new IDs when pasting arrays to prevent duplicates', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'test content',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Check that a new ID was generated\n expect(result['items.0.id']).toBeDefined()\n expect(result['items.0.id'].value).toBeDefined()\n expect(result['items.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['items.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata also has the new ID\n expect(result.items.rows).toHaveLength(1)\n expect(result.items.rows?.[0]?.id).not.toEqual(copiedArrayID)\n expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value)\n })\n\n it('should generate new IDs for nested arrays', () => {\n const copiedArrayID = new ObjectId().toHexString()\n const copiedNestedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'parent array',\n valid: true,\n },\n 'items.0.subArray': {\n value: 1,\n valid: true,\n rows: [{ id: copiedNestedArrayID }],\n },\n 'items.0.subArray.0.id': {\n value: copiedNestedArrayID,\n valid: true,\n },\n 'items.0.subArray.0.text': {\n value: 'nested array',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Check that parent array got new ID\n expect(result['items.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['items.0.id'].value as string)).toBe(true)\n\n // Check that nested array got new ID\n expect(result['items.0.subArray.0.id'].value).not.toEqual(copiedNestedArrayID)\n expect(ObjectId.isValid(result['items.0.subArray.0.id'].value as string)).toBe(true)\n\n // Check that parent and nested IDs are different\n expect(result['items.0.id'].value).not.toEqual(result['items.0.subArray.0.id'].value)\n\n // Check that parent row metadata has new ID\n expect(result.items.rows?.[0]?.id).toEqual(result['items.0.id'].value)\n\n // Check that nested row metadata has new ID\n expect(result['items.0.subArray'].rows?.[0]?.id).toEqual(\n result['items.0.subArray.0.id'].value,\n )\n })\n\n it('should preserve non-ID field values when pasting arrays', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n items: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n const clipboardData: ClipboardPasteData = {\n type: 'array',\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'preserved array text',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'items',\n })\n\n // Non-ID fields should be preserved\n expect(result['items.0.text'].value).toEqual('preserved array text')\n })\n\n it('should generate new ID when pasting from array row to field', () => {\n const copiedArrayID = new ObjectId().toHexString()\n\n const formState: FormState = {\n disableSort: {\n valid: true,\n value: 0,\n initialValue: 0,\n rows: [],\n },\n }\n\n // Simulating copying from items.0 and pasting into disableSort field\n const clipboardData = {\n type: 'array' as const,\n path: 'items',\n fields: [],\n data: {\n 'items.0.id': {\n value: copiedArrayID,\n valid: true,\n },\n 'items.0.text': {\n value: 'row one',\n valid: true,\n },\n },\n rowIndex: 0,\n }\n\n const result = mergeFormStateFromClipboard({\n dataFromClipboard: clipboardData,\n formState,\n path: 'disableSort',\n })\n\n // Check that a new ID was generated\n expect(result['disableSort.0.id']).toBeDefined()\n expect(result['disableSort.0.id'].value).toBeDefined()\n expect(result['disableSort.0.id'].value).not.toEqual(copiedArrayID)\n expect(ObjectId.isValid(result['disableSort.0.id'].value as string)).toBe(true)\n\n // Check that the row metadata has the new ID (not the copied ID)\n expect(result.disableSort.rows).toBeDefined()\n expect(result.disableSort.rows).toHaveLength(1)\n expect(result.disableSort.rows![0].id).not.toEqual(copiedArrayID)\n expect(result.disableSort.rows![0].id).toEqual(result['disableSort.0.id'].value)\n\n // Check that other fields were preserved\n expect(result['disableSort.0.text'].value).toEqual('row one')\n })\n })\n})\n"],"mappings":"AAEA,OAAOA,cAAA,MAAoB;AAC3B,SAASC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ;AAErC,SAASC,2BAA2B,QAAQ;AAG5C,MAAMC,QAAA,GACJ,aAAaL,cAAA,GAAiBA,cAAA,CAAeM,OAAO,GAAGN,cAAA;AAGzDC,QAAA,CAAS,+BAA+B;EACtCA,QAAA,CAAS,yBAAyB;IAChCE,EAAA,CAAG,qEAAqE;MACtE,MAAMI,aAAA,GAAgB,IAAIF,QAAA,GAAWG,WAAW;MAEhD,MAAMC,SAAA,GAAuB;QAC3BC,MAAA,EAAQ;UACNC,KAAA,EAAO;UACPC,KAAA,EAAO;UACPC,YAAA,EAAc;UACdC,IAAA,EAAM;QACR;MACF;MAEA,MAAMC,aAAA,GAAoC;QACxCC,IAAA,EAAM;QACNC,IAAA,EAAM;QACNC,MAAA,EAAQ,EAAE;QACVC,IAAA,EAAM;UACJ,eAAe;YACbP,KAAA,EAAOL,aAAA;YACPI,KAAA,EAAO;UACT;UACA,sBAAsB;YACpBC,KAAA,EAAO;YACPD,KAAA,EAAO;UACT;UACA,iBAAiB;YACfC,KAAA,EAAO;YACPD,KAAA,EAAO;UACT;QACF;QACAS,QAAA,EAAU;MACZ;MAEA,MAAMC,MAAA,GAASjB,2BAAA,CAA4B;QACzCkB,iBAAA,EAAmBP,aAAA;QACnBN,SAAA;QACAQ,IAAA,EAAM;MACR;MAEA;MACAf,MAAA,CAAOmB,MAAM,CAAC,cAAc,EAAEE,WAAW;MACzCrB,MAAA,CAAOmB,MAAM,CAAC,cAAc,CAACT,KAAK,EAAEW,WAAW;MAC/CrB,MAAA,CAAOmB,MAAM,CAAC,cAAc,CAACT,KAAK,EAAEY,GAAG,CAACC,OAAO,CAAClB,aAAA;MAChDL,MAAA,CAAOG,QAAA,CAASqB,OAAO,CAACL,MAAM,CAAC,cAAc,CAACT,KAAK,GAAae,IAAI,CAAC;MAErE;MACAzB,MAAA,CAAOmB,MAAA,CAAOX,MAAM,CAACI,IAAI,EAAEc,YAAY,CAAC;MACxC1B,MAAA,CAAOmB,MAAA,CAAOX,MAAM,CAACI,IAAI,GAAG,EAAE,EAAEe,EAAA,EAAIL,GAAG,CAACC,OAAO,CAAClB,aAAA;MAChDL,MAAA,CAAOmB,MAAA,CAAOX,MAAM,CAACI,IAAI,GAAG,EAAE,EAAEe,EAAA,EAAIJ,OAAO,CAACJ,MAAM,CAAC,cAAc,CAACT,KAAK;IACzE;IAEAT,EAAA,CAAG,6CAA6C;MAC9C,MAAMI,aAAA,GAAgB,IAAIF,QAAA,GAAWG,WAAW;MAChD,MAAMsB,mBAAA,GAAsB,IAAIzB,QAAA,GAAWG,WAAW;MAEtD,MAAMC,SAAA,GAAuB;QAC3BC,MAAA,EAAQ;UACNC,KAAA,EAAO;UACPC,KAAA,EAAO;UACPC,YAAA,EAAc;UACdC,IAAA,EAAM;QACR;MACF;MAEA,MAAMC,aAAA,GAAoC;QACxCC,IAAA,EAAM;QACNC,IAAA,EAAM;QACNC,MAAA,EAAQ,EAAE;QACVC,IAAA,EAAM;UACJ,eAAe;YACbP,KAAA,EAAOL,aAAA;YACPI,KAAA,EAAO;UACT;UACA,sBAAsB;YACpBC,KAAA,EAAO;YACPD,KAAA,EAAO;UACT;UACA,sBAAsB;YACpBC,KAAA,EAAO;YACPD,KAAA,EAAO;YACPG,IAAA,EAAM,CAAC;cAAEe,EAAA,EAAIC;YAAoB;UACnC;UACA,2BAA2B;YACzBlB,KAAA,EAAOkB,mBAAA;YACPnB,KAAA,EAAO;UACT;UACA,kCAAkC;YAChCC,KAAA,EAAO;YACPD,KAAA,EAAO;UACT;QACF;QACAS,QAAA,EAAU;MACZ;MAEA,MAAMC,MAAA,GAASjB,2BAAA,CAA4B;QACzCkB,iBAAA,EAAmBP,aAAA;QACnBN,SAAA;QACAQ,IAAA,EAAM;MACR;MAEA;MACAf,MAAA,CAAOmB,MAAM,CAAC,cAAc,CAACT,KAAK,EAAEY,GAAG,CAACC,OAAO,CAAClB,aAAA;MAChDL,MAAA,CAAOG,QAAA,CAASqB,OAAO,CAACL,MAAM,CAAC,cAAc,CAACT,KAAK,GAAae,IAAI,CAAC;MAErE;MACAzB,MAAA,CAAOmB,MAAM,CAAC,0BAA0B,CAACT,KAAK,EAAEY,GAAG,CAACC,OAAO,CAACK,mBAAA;MAC5D5B,MAAA,CAAOG,QAAA,CAASqB,OAAO,CAACL,MAAM,CAAC,0BAA0B,CAACT,KAAK,GAAae,IAAI,CAAC;MAEjF;MACAzB,MAAA,CAAOmB,MAAM,CAAC,cAAc,CAACT,KAAK,EAAEY,GAAG,CAACC,OAAO,CAACJ,MAAM,CAAC,0BAA0B,CAACT,KAAK;MAEvF;MACAV,MAAA,CAAOmB,MAAA,CAAOX,MAAM,CAACI,IAAI,GAAG,EAAE,EAAEe,EAAA,EAAIJ,OAAO,CAACJ,MAAM,CAAC,cAAc,CAACT,KAAK;MAEvE;MACAV,MAAA,CAAOmB,MAAM,CAAC,qBAAqB,CAACP,IAAI,GAAG,EAAE,EAAEe,EAAA,EAAIJ,OAAO,CACxDJ,MAAM,CAAC,0BAA0B,CAACT,KAAK;IAE3C;IAEAT,EAAA,CAAG,oDAAoD;MACrD,MAAMI,aAAA,GAAgB,IAAIF,QAAA,GAAWG,WAAW;MAEhD,MAAMC,SAAA,GAAuB;QAC3BC,MAAA,EAAQ;UACNC,KAAA,EAAO;UACPC,KAAA,EAAO;UACPC,YAAA,EAAc;UACdC,IAAA,EAAM;QACR;MACF;MAEA,MAAMC,aAAA,GAAoC;QACxCC,IAAA,EAAM;QACNC,IAAA,EAAM;QACNC,MAAA,EAAQ,EAAE;QACVC,IAAA,EAAM;UACJ,eAAe;YACbP,KAAA,EAAOL,aAAA;YACPI,KAAA,EAAO;UACT;UACA,sBAAsB;YACpBC,KAAA,EAAO;YACPD,KAAA,EAAO;UACT;UACA,iBAAiB;YACfC,KAAA,EAAO;YACPD,KAAA,EAAO;UACT;QACF;QACAS,QAAA,EAAU;MACZ;MAEA,MAAMC,MAAA,GAASjB,2BAAA,CAA4B;QACzCkB,iBAAA,EAAmBP,aAAA;QACnBN,SAAA;QACAQ,IAAA,EAAM;MACR;MAEA;MACAf,MAAA,CAAOmB,MAAM,CAAC,qBAAqB,CAACT,KAAK,EAAEa,OAAO,CAAC;MACnDvB,MAAA,CAAOmB,MAAM,CAAC,gBAAgB,CAACT,KAAK,EAAEa,OAAO,CAAC;IAChD;IAEAtB,EAAA,CAAG,yDAAyD;MAC1D,MAAMI,aAAA,GAAgB,IAAIF,QAAA,GAAWG,WAAW;MAEhD,MAAMC,SAAA,GAAuB;QAC3BsB,SAAA,EAAW;UACTpB,KAAA,EAAO;UACPC,KAAA,EAAO;UACPC,YAAA,EAAc;UACdC,IAAA,EAAM;QACR;MACF;MAEA;MACA,MAAMC,aAAA,GAAgB;QACpBC,IAAA,EAAM;QACNC,IAAA,EAAM;QACNC,MAAA,EAAQ,EAAE;QACVC,IAAA,EAAM;UACJ,eAAe;YACbP,KAAA,EAAOL,aAAA;YACPI,KAAA,EAAO;UACT;UACA,sBAAsB;YACpBC,KAAA,EAAO;YACPD,KAAA,EAAO;UACT;UACA,mBAAmB;YACjBC,KAAA,EAAO;YACPD,KAAA,EAAO;UACT;QACF;QACAS,QAAA,EAAU;MACZ;MAEA,MAAMC,MAAA,GAASjB,2BAAA,CAA4B;QACzCkB,iBAAA,EAAmBP,aAAA;QACnBN,SAAA;QACAQ,IAAA,EAAM;MACR;MAEA;MACAf,MAAA,CAAOmB,MAAM,CAAC,iBAAiB,EAAEE,WAAW;MAC5CrB,MAAA,CAAOmB,MAAM,CAAC,iBAAiB,CAACT,KAAK,EAAEW,WAAW;MAClDrB,MAAA,CAAOmB,MAAM,CAAC,iBAAiB,CAACT,KAAK,EAAEY,GAAG,CAACC,OAAO,CAAClB,aAAA;MACnDL,MAAA,CAAOG,QAAA,CAASqB,OAAO,CAACL,MAAM,CAAC,iBAAiB,CAACT,KAAK,GAAae,IAAI,CAAC;MAExE;MACAzB,MAAA,CAAOmB,MAAA,CAAOU,SAAS,CAACjB,IAAI,EAAES,WAAW;MACzCrB,MAAA,CAAOmB,MAAA,CAAOU,SAAS,CAACjB,IAAI,EAAEc,YAAY,CAAC;MAC3C1B,MAAA,CAAOmB,MAAA,CAAOU,SAAS,CAACjB,IAAI,CAAE,EAAE,CAACe,EAAE,EAAEL,GAAG,CAACC,OAAO,CAAClB,aAAA;MACjDL,MAAA,CAAOmB,MAAA,CAAOU,SAAS,CAACjB,IAAI,CAAE,EAAE,CAACe,EAAE,EAAEJ,OAAO,CAACJ,MAAM,CAAC,iBAAiB,CAACT,KAAK;MAE3E;MACAV,MAAA,CAAOmB,MAAM,CAAC,qBAAqB,CAACT,KAAK,EAAEa,OAAO,CAAC;IACrD;EACF;EAEAxB,QAAA,CAAS,qCAAqC;IAC5CE,EAAA,CAAG,oEAAoE;MACrE,MAAMI,aAAA,GAAgB,IAAIF,QAAA,GAAWG,WAAW;MAChD,MAAMwB,kBAAA,GAAqB,IAAI3B,QAAA,GAAWG,WAAW;MACrD,MAAMyB,kBAAA,GAAqB,IAAI5B,QAAA,GAAWG,WAAW;MACrD,MAAM0B,kBAAA,GAAqB,IAAI7B,QAAA,GAAWG,WAAW;MACrD,MAAM2B,aAAA,GAAgB,IAAI9B,QAAA,GAAWG,WAAW;MAEhD;MACA,MAAMC,SAAA,GAAuB;QAC3B2B,IAAA,EAAM;UACJzB,KAAA,EAAO;UACPC,KAAA,EAAO;UACPC,YAAA,EAAc;UACdC,IAAA,EAAM,CACJ;YAAEe,EAAA,EAAItB,aAAA;YAAe8B,SAAA,EAAW;YAAgBC,SAAA,EAAW;UAAM,GACjE;YAAET,EAAA,EAAIM,aAAA;YAAeE,SAAA,EAAW;YAAgBC,SAAA,EAAW;UAAM;QAErE;QACA,UAAU;UAAE1B,KAAA,EAAO;UAAgBD,KAAA,EAAO;QAAK;QAC/C,aAAa;UAAEC,KAAA,EAAOL,aAAA;UAAeI,KAAA,EAAO;QAAK;QACjD,kBAAkB;UAChBA,KAAA,EAAO;UACPC,KAAA,EAAO;UACPE,IAAA,EAAM,CACJ;YAAEe,EAAA,EAAIG,kBAAA;YAAoBM,SAAA,EAAW;UAAM,GAC3C;YAAET,EAAA,EAAII,kBAAA;YAAoBK,SAAA,EAAW;UAAM,GAC3C;YAAET,EAAA,EAAIK,kBAAA;YAAoBI,SAAA,EAAW;UAAM;QAE/C;QACA,uBAAuB;UAAE1B,KAAA,EAAOoB,kBAAA;UAAoBrB,KAAA,EAAO;QAAK;QAChE,uBAAuB;UAAEC,KAAA,EAAOqB,kBAAA;UAAoBtB,KAAA,EAAO;QAAK;QAChE,uBAAuB;UAAEC,KAAA,EAAOsB,kBAAA;UAAoBvB,KAAA,EAAO;QAAK;QAChE,UAAU;UAAEC,KAAA,EAAO;UAAgBD,KAAA,EAAO;QAAK;QAC/C,aAAa;UAAEC,KAAA,EAAOuB,aAAA;UAAexB,KAAA,EAAO;QAAK;QACjD,kBAAkB;UAChBA,KAAA,EAAO;UACPC,KAAA,EAAO;UACPE,IAAA,EAAM;QACR;MACF;MAEA;MACA,MAAMC,aAAA,GAAoC;QACxCC,IAAA,EAAM;QACNC,IAAA,EAAM;QACNC,MAAA,EAAQ,EAAE;QACVE,QAAA,EAAU;QACVD,IAAA,EAAM;UACJ,UAAU;YAAEP,KAAA,EAAO;YAAgBD,KAAA,EAAO;UAAK;UAC/C,aAAa;YAAEC,KAAA,EAAOL,aAAA;YAAeI,KAAA,EAAO;UAAK;UACjD,kBAAkB;YAChBA,KAAA,EAAO;YACPC,KAAA,EAAO;YACPE,IAAA,EAAM,CACJ;cAAEe,EAAA,EAAIG,kBAAA;cAAoBM,SAAA,EAAW;YAAM,GAC3C;cAAET,EAAA,EAAII,kBAAA;cAAoBK,SAAA,EAAW;YAAM,GAC3C;cAAET,EAAA,EAAIK,kBAAA;cAAoBI,SAAA,EAAW;YAAM;UAE/C;UACA,uBAAuB;YAAE1B,KAAA,EAAOoB,kBAAA;YAAoBrB,KAAA,EAAO;UAAK;UAChE,0BAA0B;YAAEC,KAAA,EAAO;YAAYD,KAAA,EAAO;UAAK;UAC3D,uBAAuB;YAAEC,KAAA,EAAOqB,kBAAA;YAAoBtB,KAAA,EAAO;UAAK;UAChE,0BAA0B;YAAEC,KAAA,EAAO;YAAYD,KAAA,EAAO;UAAK;UAC3D,uBAAuB;YAAEC,KAAA,EAAOsB,kBAAA;YAAoBvB,KAAA,EAAO;UAAK;UAChE,0BAA0B;YAAEC,KAAA,EAAO;YAAYD,KAAA,EAAO;UAAK;QAC7D;MACF;MAEA;MACA,MAAMU,MAAA,GAASjB,2BAAA,CAA4B;QACzCkB,iBAAA,EAAmBP,aAAA;QACnBN,SAAA;QACAQ,IAAA,EAAM;QACNG,QAAA,EAAU;MACZ;MAEA;MACAlB,MAAA,CAAOmB,MAAM,CAAC,YAAY,CAACT,KAAK,EAAEa,OAAO,CAACU,aAAA;MAE1C;MACAjC,MAAA,CAAOmB,MAAM,CAAC,sBAAsB,EAAEE,WAAW;MACjDrB,MAAA,CAAOmB,MAAM,CAAC,sBAAsB,CAACT,KAAK,EAAEY,GAAG,CAACC,OAAO,CAACO,kBAAA;MACxD9B,MAAA,CAAOG,QAAA,CAASqB,OAAO,CAACL,MAAM,CAAC,sBAAsB,CAACT,KAAK,GAAae,IAAI,CAAC;MAE7EzB,MAAA,CAAOmB,MAAM,CAAC,sBAAsB,EAAEE,WAAW;MACjDrB,MAAA,CAAOmB,MAAM,CAAC,sBAAsB,CAACT,KAAK,EAAEY,GAAG,CAACC,OAAO,CAACQ,kBAAA;MAExD/B,MAAA,CAAOmB,MAAM,CAAC,sBAAsB,EAAEE,WAAW;MACjDrB,MAAA,CAAOmB,MAAM,CAAC,sBAAsB,CAACT,KAAK,EAAEY,GAAG,CAACC,OAAO,CAACS,kBAAA;MAExD;MACAhC,MAAA,CAAOmB,MAAM,CAAC,iBAAiB,CAACP,IAAI,EAAEc,YAAY,CAAC;MACnD1B,MAAA,CAAOmB,MAAM,CAAC,iBAAiB,CAACP,IAAI,CAAE,EAAE,CAACe,EAAE,EAAEJ,OAAO,CAACJ,MAAM,CAAC,sBAAsB,CAACT,KAAK;MACxFV,MAAA,CAAOmB,MAAM,CAAC,iBAAiB,CAACP,IAAI,CAAE,EAAE,CAACe,EAAE,EAAEJ,OAAO,CAACJ,MAAM,CAAC,sBAAsB,CAACT,KAAK;MACxFV,MAAA,CAAOmB,MAAM,CAAC,iBAAiB,CAACP,IAAI,CAAE,EAAE,CAACe,EAAE,EAAEJ,OAAO,CAACJ,MAAM,CAAC,sBAAsB,CAACT,KAAK;MAExF;MACAV,MAAA,CAAOmB,MAAM,CAAC,yBAAyB,CAACT,KAAK,EAAEa,OAAO,CAAC;MACvDvB,MAAA,CAAOmB,MAAM,CAAC,yBAAyB,CAACT,KAAK,EAAEa,OAAO,CAAC;MACvDvB,MAAA,CAAOmB,MAAM,CAAC,yBAAyB,CAACT,KAAK,EAAEa,OAAO,CAAC;MAEvD;MACAvB,MAAA,CAAOmB,MAAM,CAAC,YAAY,CAACT,KAAK,EAAEa,OAAO,CAAClB,aAAA;MAC1CL,MAAA,CAAOmB,MAAM,CAAC,iBAAiB,CAACP,IAAI,EAAEc,YAAY,CAAC;IACrD;EACF;EAEA3B,QAAA,CAAS,yBAAyB;IAChCE,EAAA,CAAG,qEAAqE;MACtE,MAAMoC,aAAA,GAAgB,IAAIlC,QAAA,GAAWG,WAAW;MAEhD,MAAMC,SAAA,GAAuB;QAC3B+B,KAAA,EAAO;UACL7B,KAAA,EAAO;UACPC,KAAA,EAAO;UACPC,YAAA,EAAc;UACdC,IAAA,EAAM;QACR;MACF;MAEA,MAAMC,aAAA,GAAoC;QACxCC,IAAA,EAAM;QACNC,IAAA,EAAM;QACNwB,MAAA,EAAQ,EAAE;QACVtB,IAAA,EAAM;UACJ,cAAc;YACZP,KAAA,EAAO2B,aAAA;YACP5B,KAAA,EAAO;UACT;UACA,gBAAgB;YACdC,KAAA,EAAO;YACPD,KAAA,EAAO;UACT;QACF;QACAS,QAAA,EAAU;MACZ;MAEA,MAAMC,MAAA,GAASjB,2BAAA,CAA4B;QACzCkB,iBAAA,EAAmBP,aAAA;QACnBN,SAAA;QACAQ,IAAA,EAAM;MACR;MAEA;MACAf,MAAA,CAAOmB,MAAM,CAAC,aAAa,EAAEE,WAAW;MACxCrB,MAAA,CAAOmB,MAAM,CAAC,aAAa,CAACT,KAAK,EAAEW,WAAW;MAC9CrB,MAAA,CAAOmB,MAAM,CAAC,aAAa,CAACT,KAAK,EAAEY,GAAG,CAACC,OAAO,CAACc,aAAA;MAC/CrC,MAAA,CAAOG,QAAA,CAASqB,OAAO,CAACL,MAAM,CAAC,aAAa,CAACT,KAAK,GAAae,IAAI,CAAC;MAEpE;MACAzB,MAAA,CAAOmB,MAAA,CAAOmB,KAAK,CAAC1B,IAAI,EAAEc,YAAY,CAAC;MACvC1B,MAAA,CAAOmB,MAAA,CAAOmB,KAAK,CAAC1B,IAAI,GAAG,EAAE,EAAEe,EAAA,EAAIL,GAAG,CAACC,OAAO,CAACc,aAAA;MAC/CrC,MAAA,CAAOmB,MAAA,CAAOmB,KAAK,CAAC1B,IAAI,GAAG,EAAE,EAAEe,EAAA,EAAIJ,OAAO,CAACJ,MAAM,CAAC,aAAa,CAACT,KAAK;IACvE;IAEAT,EAAA,CAAG,6CAA6C;MAC9C,MAAMoC,aAAA,GAAgB,IAAIlC,QAAA,GAAWG,WAAW;MAChD,MAAMkC,mBAAA,GAAsB,IAAIrC,QAAA,GAAWG,WAAW;MAEtD,MAAMC,SAAA,GAAuB;QAC3B+B,KAAA,EAAO;UACL7B,KAAA,EAAO;UACPC,KAAA,EAAO;UACPC,YAAA,EAAc;UACdC,IAAA,EAAM;QACR;MACF;MAEA,MAAMC,aAAA,GAAoC;QACxCC,IAAA,EAAM;QACNC,IAAA,EAAM;QACNwB,MAAA,EAAQ,EAAE;QACVtB,IAAA,EAAM;UACJ,cAAc;YACZP,KAAA,EAAO2B,aAAA;YACP5B,KAAA,EAAO;UACT;UACA,gBAAgB;YACdC,KAAA,EAAO;YACPD,KAAA,EAAO;UACT;UACA,oBAAoB;YAClBC,KAAA,EAAO;YACPD,KAAA,EAAO;YACPG,IAAA,EAAM,CAAC;cAAEe,EAAA,EAAIa;YAAoB;UACnC;UACA,yBAAyB;YACvB9B,KAAA,EAAO8B,mBAAA;YACP/B,KAAA,EAAO;UACT;UACA,2BAA2B;YACzBC,KAAA,EAAO;YACPD,KAAA,EAAO;UACT;QACF;QACAS,QAAA,EAAU;MACZ;MAEA,MAAMC,MAAA,GAASjB,2BAAA,CAA4B;QACzCkB,iBAAA,EAAmBP,aAAA;QACnBN,SAAA;QACAQ,IAAA,EAAM;MACR;MAEA;MACAf,MAAA,CAAOmB,MAAM,CAAC,aAAa,CAACT,KAAK,EAAEY,GAAG,CAACC,OAAO,CAACc,aAAA;MAC/CrC,MAAA,CAAOG,QAAA,CAASqB,OAAO,CAACL,MAAM,CAAC,aAAa,CAACT,KAAK,GAAae,IAAI,CAAC;MAEpE;MACAzB,MAAA,CAAOmB,MAAM,CAAC,wBAAwB,CAACT,KAAK,EAAEY,GAAG,CAACC,OAAO,CAACiB,mBAAA;MAC1DxC,MAAA,CAAOG,QAAA,CAASqB,OAAO,CAACL,MAAM,CAAC,wBAAwB,CAACT,KAAK,GAAae,IAAI,CAAC;MAE/E;MACAzB,MAAA,CAAOmB,MAAM,CAAC,aAAa,CAACT,KAAK,EAAEY,GAAG,CAACC,OAAO,CAACJ,MAAM,CAAC,wBAAwB,CAACT,KAAK;MAEpF;MACAV,MAAA,CAAOmB,MAAA,CAAOmB,KAAK,CAAC1B,IAAI,GAAG,EAAE,EAAEe,EAAA,EAAIJ,OAAO,CAACJ,MAAM,CAAC,aAAa,CAACT,KAAK;MAErE;MACAV,MAAA,CAAOmB,MAAM,CAAC,mBAAmB,CAACP,IAAI,GAAG,EAAE,EAAEe,EAAA,EAAIJ,OAAO,CACtDJ,MAAM,CAAC,wBAAwB,CAACT,KAAK;IAEzC;IAEAT,EAAA,CAAG,2DAA2D;MAC5D,MAAMoC,aAAA,GAAgB,IAAIlC,QAAA,GAAWG,WAAW;MAEhD,MAAMC,SAAA,GAAuB;QAC3B+B,KAAA,EAAO;UACL7B,KAAA,EAAO;UACPC,KAAA,EAAO;UACPC,YAAA,EAAc;UACdC,IAAA,EAAM;QACR;MACF;MAEA,MAAMC,aAAA,GAAoC;QACxCC,IAAA,EAAM;QACNC,IAAA,EAAM;QACNwB,MAAA,EAAQ,EAAE;QACVtB,IAAA,EAAM;UACJ,cAAc;YACZP,KAAA,EAAO2B,aAAA;YACP5B,KAAA,EAAO;UACT;UACA,gBAAgB;YACdC,KAAA,EAAO;YACPD,KAAA,EAAO;UACT;QACF;QACAS,QAAA,EAAU;MACZ;MAEA,MAAMC,MAAA,GAASjB,2BAAA,CAA4B;QACzCkB,iBAAA,EAAmBP,aAAA;QACnBN,SAAA;QACAQ,IAAA,EAAM;MACR;MAEA;MACAf,MAAA,CAAOmB,MAAM,CAAC,eAAe,CAACT,KAAK,EAAEa,OAAO,CAAC;IAC/C;IAEAtB,EAAA,CAAG,+DAA+D;MAChE,MAAMoC,aAAA,GAAgB,IAAIlC,QAAA,GAAWG,WAAW;MAEhD,MAAMC,SAAA,GAAuB;QAC3BkC,WAAA,EAAa;UACXhC,KAAA,EAAO;UACPC,KAAA,EAAO;UACPC,YAAA,EAAc;UACdC,IAAA,EAAM;QACR;MACF;MAEA;MACA,MAAMC,aAAA,GAAgB;QACpBC,IAAA,EAAM;QACNC,IAAA,EAAM;QACNwB,MAAA,EAAQ,EAAE;QACVtB,IAAA,EAAM;UACJ,cAAc;YACZP,KAAA,EAAO2B,aAAA;YACP5B,KAAA,EAAO;UACT;UACA,gBAAgB;YACdC,KAAA,EAAO;YACPD,KAAA,EAAO;UACT;QACF;QACAS,QAAA,EAAU;MACZ;MAEA,MAAMC,MAAA,GAASjB,2BAAA,CAA4B;QACzCkB,iBAAA,EAAmBP,aAAA;QACnBN,SAAA;QACAQ,IAAA,EAAM;MACR;MAEA;MACAf,MAAA,CAAOmB,MAAM,CAAC,mBAAmB,EAAEE,WAAW;MAC9CrB,MAAA,CAAOmB,MAAM,CAAC,mBAAmB,CAACT,KAAK,EAAEW,WAAW;MACpDrB,MAAA,CAAOmB,MAAM,CAAC,mBAAmB,CAACT,KAAK,EAAEY,GAAG,CAACC,OAAO,CAACc,aAAA;MACrDrC,MAAA,CAAOG,QAAA,CAASqB,OAAO,CAACL,MAAM,CAAC,mBAAmB,CAACT,KAAK,GAAae,IAAI,CAAC;MAE1E;MACAzB,MAAA,CAAOmB,MAAA,CAAOsB,WAAW,CAAC7B,IAAI,EAAES,WAAW;MAC3CrB,MAAA,CAAOmB,MAAA,CAAOsB,WAAW,CAAC7B,IAAI,EAAEc,YAAY,CAAC;MAC7C1B,MAAA,CAAOmB,MAAA,CAAOsB,WAAW,CAAC7B,IAAI,CAAE,EAAE,CAACe,EAAE,EAAEL,GAAG,CAACC,OAAO,CAACc,aAAA;MACnDrC,MAAA,CAAOmB,MAAA,CAAOsB,WAAW,CAAC7B,IAAI,CAAE,EAAE,CAACe,EAAE,EAAEJ,OAAO,CAACJ,MAAM,CAAC,mBAAmB,CAACT,KAAK;MAE/E;MACAV,MAAA,CAAOmB,MAAM,CAAC,qBAAqB,CAACT,KAAK,EAAEa,OAAO,CAAC;IACrD;EACF;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Combobox/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAoC,MAAM,OAAO,CAAA;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAGnD,OAAO,cAAc,CAAA;AAIrB;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAA;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAmG5C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Combobox/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAoC,MAAM,OAAO,CAAA;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAGnD,OAAO,cAAc,CAAA;AAIrB;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,aAAa,EAAE,CAAA;IACxB,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAA;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAoG5C,CAAA"}
@@ -77,6 +77,7 @@ export const Combobox = props => {
77
77
  };
78
78
  return /*#__PURE__*/_jsx("div", {
79
79
  className: `${baseClass}__entry`,
80
+ "data-popup-prevent-close": true,
80
81
  onClick: handleClick,
81
82
  onKeyDown: e_0 => {
82
83
  if (e_0.key === 'Enter' || e_0.key === ' ') {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["React","useMemo","useRef","useState","Popup","PopupList","baseClass","Combobox","props","entries","minEntriesForSearch","onSelect","onToggleClose","onToggleOpen","searchPlaceholder","popupProps","searchValue","setSearchValue","isOpenRef","searchInputRef","filteredEntries","search","toLowerCase","filter","entry","name","includes","showSearch","length","hasResults","handleToggleOpen","useCallback","active","current","setTimeout","focus","handleToggleClose","_jsx","className","render","close","_jsxs","onChange","e","target","value","placeholder","ref","type","ButtonGroup","map","index","handleClick","onClick","onKeyDown","key","preventDefault","role","tabIndex","Component"],"sources":["../../../src/elements/Combobox/index.tsx"],"sourcesContent":["'use client'\nimport React, { useMemo, useRef, useState } from 'react'\n\nimport type { PopupProps } from '../Popup/index.js'\n\nimport { Popup, PopupList } from '../Popup/index.js'\nimport './index.scss'\n\nconst baseClass = 'combobox'\n\n/**\n * @internal\n * @experimental\n */\nexport type ComboboxEntry = {\n Component: React.ReactNode\n name: string\n}\n\n/**\n * @internal\n * @experimental\n */\nexport type ComboboxProps = {\n entries: ComboboxEntry[]\n /** Minimum number of entries required to show search */\n minEntriesForSearch?: number\n onSelect?: (entry: ComboboxEntry) => void\n searchPlaceholder?: string\n} & Omit<PopupProps, 'children' | 'render'>\n\n/**\n * A wrapper on top of Popup + PopupList.ButtonGroup that adds search functionality.\n *\n * @internal - this component may be removed or receive breaking changes in minor releases.\n * @experimental\n */\nexport const Combobox: React.FC<ComboboxProps> = (props) => {\n const {\n entries,\n minEntriesForSearch = 8,\n onSelect,\n onToggleClose,\n onToggleOpen,\n searchPlaceholder = 'Search...',\n ...popupProps\n } = props\n const [searchValue, setSearchValue] = useState('')\n const isOpenRef = useRef(false)\n const searchInputRef = useRef<HTMLInputElement>(null)\n\n const filteredEntries = useMemo(() => {\n if (!searchValue) {\n return entries\n }\n const search = searchValue.toLowerCase()\n return entries.filter((entry) => entry.name.toLowerCase().includes(search))\n }, [entries, searchValue])\n\n const showSearch = entries.length >= minEntriesForSearch\n const hasResults = filteredEntries.length > 0\n\n const handleToggleOpen = React.useCallback(\n (active: boolean) => {\n isOpenRef.current = active\n if (active && showSearch) {\n setTimeout(() => {\n searchInputRef.current?.focus()\n }, 100)\n }\n onToggleOpen?.(active)\n },\n [showSearch, onToggleOpen],\n )\n\n const handleToggleClose = React.useCallback(() => {\n isOpenRef.current = false\n setSearchValue('')\n onToggleClose?.()\n }, [onToggleClose])\n\n return (\n <Popup\n {...popupProps}\n className={`${baseClass} ${popupProps.className || ''}`}\n onToggleClose={handleToggleClose}\n onToggleOpen={handleToggleOpen}\n render={({ close }) => (\n <div className={`${baseClass}__content`}>\n {showSearch && (\n <div\n className={`${baseClass}__search-wrapper${!hasResults ? ` ${baseClass}__search-wrapper--no-results` : ''}`}\n >\n <input\n aria-label={searchPlaceholder}\n className={`${baseClass}__search-input`}\n onChange={(e) => setSearchValue(e.target.value)}\n placeholder={searchPlaceholder}\n ref={searchInputRef}\n type=\"text\"\n value={searchValue}\n />\n </div>\n )}\n <PopupList.ButtonGroup>\n {filteredEntries.map((entry, index) => {\n const handleClick = () => {\n if (onSelect) {\n onSelect(entry)\n }\n close()\n }\n\n return (\n <div\n className={`${baseClass}__entry`}\n key={`${entry.name}-${index}`}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }}\n role=\"menuitem\"\n tabIndex={0}\n >\n {entry.Component}\n </div>\n )\n })}\n </PopupList.ButtonGroup>\n </div>\n )}\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["React","useMemo","useRef","useState","Popup","PopupList","baseClass","Combobox","props","entries","minEntriesForSearch","onSelect","onToggleClose","onToggleOpen","searchPlaceholder","popupProps","searchValue","setSearchValue","isOpenRef","searchInputRef","filteredEntries","search","toLowerCase","filter","entry","name","includes","showSearch","length","hasResults","handleToggleOpen","useCallback","active","current","setTimeout","focus","handleToggleClose","_jsx","className","render","close","_jsxs","onChange","e","target","value","placeholder","ref","type","ButtonGroup","map","index","handleClick","onClick","onKeyDown","key","preventDefault","role","tabIndex","Component"],"sources":["../../../src/elements/Combobox/index.tsx"],"sourcesContent":["'use client'\nimport React, { useMemo, useRef, useState } from 'react'\n\nimport type { PopupProps } from '../Popup/index.js'\n\nimport { Popup, PopupList } from '../Popup/index.js'\nimport './index.scss'\n\nconst baseClass = 'combobox'\n\n/**\n * @internal\n * @experimental\n */\nexport type ComboboxEntry = {\n Component: React.ReactNode\n name: string\n}\n\n/**\n * @internal\n * @experimental\n */\nexport type ComboboxProps = {\n entries: ComboboxEntry[]\n /** Minimum number of entries required to show search */\n minEntriesForSearch?: number\n onSelect?: (entry: ComboboxEntry) => void\n searchPlaceholder?: string\n} & Omit<PopupProps, 'children' | 'render'>\n\n/**\n * A wrapper on top of Popup + PopupList.ButtonGroup that adds search functionality.\n *\n * @internal - this component may be removed or receive breaking changes in minor releases.\n * @experimental\n */\nexport const Combobox: React.FC<ComboboxProps> = (props) => {\n const {\n entries,\n minEntriesForSearch = 8,\n onSelect,\n onToggleClose,\n onToggleOpen,\n searchPlaceholder = 'Search...',\n ...popupProps\n } = props\n const [searchValue, setSearchValue] = useState('')\n const isOpenRef = useRef(false)\n const searchInputRef = useRef<HTMLInputElement>(null)\n\n const filteredEntries = useMemo(() => {\n if (!searchValue) {\n return entries\n }\n const search = searchValue.toLowerCase()\n return entries.filter((entry) => entry.name.toLowerCase().includes(search))\n }, [entries, searchValue])\n\n const showSearch = entries.length >= minEntriesForSearch\n const hasResults = filteredEntries.length > 0\n\n const handleToggleOpen = React.useCallback(\n (active: boolean) => {\n isOpenRef.current = active\n if (active && showSearch) {\n setTimeout(() => {\n searchInputRef.current?.focus()\n }, 100)\n }\n onToggleOpen?.(active)\n },\n [showSearch, onToggleOpen],\n )\n\n const handleToggleClose = React.useCallback(() => {\n isOpenRef.current = false\n setSearchValue('')\n onToggleClose?.()\n }, [onToggleClose])\n\n return (\n <Popup\n {...popupProps}\n className={`${baseClass} ${popupProps.className || ''}`}\n onToggleClose={handleToggleClose}\n onToggleOpen={handleToggleOpen}\n render={({ close }) => (\n <div className={`${baseClass}__content`}>\n {showSearch && (\n <div\n className={`${baseClass}__search-wrapper${!hasResults ? ` ${baseClass}__search-wrapper--no-results` : ''}`}\n >\n <input\n aria-label={searchPlaceholder}\n className={`${baseClass}__search-input`}\n onChange={(e) => setSearchValue(e.target.value)}\n placeholder={searchPlaceholder}\n ref={searchInputRef}\n type=\"text\"\n value={searchValue}\n />\n </div>\n )}\n <PopupList.ButtonGroup>\n {filteredEntries.map((entry, index) => {\n const handleClick = () => {\n if (onSelect) {\n onSelect(entry)\n }\n close()\n }\n\n return (\n <div\n className={`${baseClass}__entry`}\n data-popup-prevent-close\n key={`${entry.name}-${index}`}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }}\n role=\"menuitem\"\n tabIndex={0}\n >\n {entry.Component}\n </div>\n )\n })}\n </PopupList.ButtonGroup>\n </div>\n )}\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}