@bagelink/vue 0.0.237 → 0.0.241

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 (35) hide show
  1. package/dist/components/Btn.vue.d.ts +1 -1
  2. package/dist/components/Btn.vue.d.ts.map +1 -1
  3. package/dist/components/Drop.vue.d.ts +34 -0
  4. package/dist/components/Drop.vue.d.ts.map +1 -0
  5. package/dist/components/FileUploader.vue.d.ts +60 -0
  6. package/dist/components/FileUploader.vue.d.ts.map +1 -0
  7. package/dist/components/Modal.vue.d.ts.map +1 -1
  8. package/dist/components/ModalForm.vue.d.ts.map +1 -1
  9. package/dist/components/TableSchema.vue.d.ts +2 -0
  10. package/dist/components/TableSchema.vue.d.ts.map +1 -1
  11. package/dist/components/form/BglField.vue.d.ts.map +1 -1
  12. package/dist/components/form/BglForm.vue.d.ts.map +1 -1
  13. package/dist/components/form/ItemRef.vue.d.ts +1 -0
  14. package/dist/components/form/ItemRef.vue.d.ts.map +1 -1
  15. package/dist/components/form/inputs/SelectField.vue.d.ts +1 -4
  16. package/dist/components/form/inputs/SelectField.vue.d.ts.map +1 -1
  17. package/dist/components/form/inputs/TextInput.vue.d.ts +1 -1
  18. package/dist/components/form/inputs/TextInput.vue.d.ts.map +1 -1
  19. package/dist/components/form/inputs/ToggleInput.vue.d.ts +6 -6
  20. package/dist/index.cjs +1714 -1706
  21. package/dist/index.mjs +1714 -1706
  22. package/dist/plugins/bagel.d.ts +1 -1
  23. package/dist/style.css +105 -80
  24. package/dist/types/index.d.ts +1 -1
  25. package/package.json +4 -4
  26. package/src/components/Btn.vue +4 -1
  27. package/src/components/Modal.vue +4 -2
  28. package/src/components/ModalForm.vue +33 -6
  29. package/src/components/TableSchema.vue +11 -54
  30. package/src/components/form/BglField.vue +21 -6
  31. package/src/components/form/BglForm.vue +32 -6
  32. package/src/plugins/modal.ts +1 -1
  33. package/src/styles/modal.css +26 -14
  34. package/src/styles/theme.css +19 -4
  35. package/tsconfig.json +7 -3
@@ -1,5 +1,5 @@
1
1
  import type { InjectionKey, Plugin } from 'vue';
2
- import { Bagel } from '@bagelink/sdk';
2
+ import { Bagel } from '../../../sdk/src/index.ts';
3
3
  export declare const bagelInjectionKey: InjectionKey<Bagel>;
4
4
  export declare const i18nTInjectionKey: InjectionKey<(key: string) => string>;
5
5
  export declare function useBagel(): Bagel;
package/dist/style.css CHANGED
@@ -306,16 +306,16 @@
306
306
  }
307
307
  }
308
308
 
309
- .loading[data-v-593b2146] {
309
+ .loading[data-v-1a7bde1e] {
310
310
  border: 1px solid var(--bgl-white);
311
311
  border-bottom: 2px solid var(--bgl-white);
312
- animation: spin-593b2146 1s linear infinite;
312
+ animation: spin-1a7bde1e 1s linear infinite;
313
313
  border-radius: 100px;
314
314
  width: 1rem;
315
315
  height: 1rem;
316
316
  margin: auto;
317
317
  }
318
- @keyframes spin-593b2146 {
318
+ @keyframes spin-1a7bde1e {
319
319
  0% {
320
320
  transform: rotate(0deg);
321
321
  }
@@ -323,7 +323,7 @@
323
323
  transform: rotate(360deg);
324
324
  }
325
325
  }
326
- .btn-icon[data-v-593b2146] {
326
+ .btn-icon[data-v-1a7bde1e] {
327
327
  height: var(--btn-height);
328
328
  width: var(--btn-height);
329
329
  border-radius: 100%;
@@ -333,97 +333,97 @@
333
333
  flex-shrink: 0;
334
334
  transition: var(--bgl-transition);
335
335
  }
336
- .btn[data-v-593b2146] {
336
+ .btn[data-v-1a7bde1e] {
337
337
  padding-left: var(--btn-padding);
338
338
  padding-right: var(--btn-padding);
339
339
  transition: var(--bgl-transition);
340
340
  text-decoration: none;
341
341
  }
342
- .btn[disabled="true"][data-v-593b2146] {
342
+ .btn[disabled="true"][data-v-1a7bde1e] {
343
343
  opacity: 0.5;
344
344
  cursor: not-allowed;
345
345
  }
346
- .btn-flex[data-v-593b2146] {
346
+ .btn-flex[data-v-1a7bde1e] {
347
347
  display: flex;
348
348
  align-items: center;
349
349
  gap: 0.5rem;
350
350
  justify-content: center;
351
351
  }
352
- .btn .icon-font[data-v-593b2146] {
352
+ .btn .icon-font[data-v-1a7bde1e] {
353
353
  font-size: calc(var(--input-font-size) * 1.3);
354
354
  }
355
- .btn[data-v-593b2146],
356
- .btn-icon[data-v-593b2146] {
357
- background-color: var(--bfb3f9c4);
358
- color: var(--5ae19879);
355
+ .btn[data-v-1a7bde1e],
356
+ .btn-icon[data-v-1a7bde1e] {
357
+ background-color: var(--566fc0e2);
358
+ color: var(--03adf93d);
359
359
  }
360
- .btn[data-v-593b2146]:hover,
361
- .btn-icon[data-v-593b2146]:hover {
360
+ .btn[data-v-1a7bde1e]:hover,
361
+ .btn-icon[data-v-1a7bde1e]:hover {
362
362
  filter: var(--bgl-hover-filter);
363
363
  }
364
- .btn[data-v-593b2146]:active,
365
- .btn-icon[data-v-593b2146]:active {
364
+ .btn[data-v-1a7bde1e]:active,
365
+ .btn-icon[data-v-1a7bde1e]:active {
366
366
  filter: var(--bgl-active-filter);
367
367
  }
368
- .btn.flatBtn[data-v-593b2146] {
368
+ .btn.flatBtn[data-v-1a7bde1e] {
369
369
  padding-left: var(--btn-padding);
370
370
  padding-right: var(--btn-padding);
371
371
  background: transparent;
372
372
  }
373
- .btn-icon.flatBtn[data-v-593b2146] {
373
+ .btn-icon.flatBtn[data-v-1a7bde1e] {
374
374
  background: transparent;
375
375
  }
376
- .btn.flatBtn[data-v-593b2146]:hover,
377
- .btn-icon.flatBtn[data-v-593b2146]:hover {
376
+ .btn.flatBtn[data-v-1a7bde1e]:hover,
377
+ .btn-icon.flatBtn[data-v-1a7bde1e]:hover {
378
378
  filter: var(--bgl-active-filter);
379
379
  }
380
- .btn.flatBtn[data-v-593b2146]:active,
381
- .btn-icon.flatBtn[data-v-593b2146]:active {
380
+ .btn.flatBtn[data-v-1a7bde1e]:active,
381
+ .btn-icon.flatBtn[data-v-1a7bde1e]:active {
382
382
  background: var(--bgl-white);
383
383
  filter: var(--bgl-hover-filter);
384
384
  }
385
- .btn.flatBtn.red[data-v-593b2146],
386
- .btn-icon.flatBtn.red[data-v-593b2146] {
385
+ .btn.flatBtn.red[data-v-1a7bde1e],
386
+ .btn-icon.flatBtn.red[data-v-1a7bde1e] {
387
387
  color: var(--bgl-red);
388
388
  }
389
- .btn.flatBtn.light[data-v-593b2146],
390
- .btn-icon.flatBtn.light[data-v-593b2146] {
389
+ .btn.flatBtn.light[data-v-1a7bde1e],
390
+ .btn-icon.flatBtn.light[data-v-1a7bde1e] {
391
391
  color: var(--bgl-primary-tint);
392
392
  }
393
- .btn.flatBtn.black[data-v-593b2146],
394
- .btn-icon.flatBtn.black[data-v-593b2146] {
393
+ .btn.flatBtn.black[data-v-1a7bde1e],
394
+ .btn-icon.flatBtn.black[data-v-1a7bde1e] {
395
395
  color: var(--bgl-black);
396
396
  }
397
- .btn.flatBtn.gray[data-v-593b2146],
398
- .btn-icon.flatBtn.gray[data-v-593b2146] {
397
+ .btn.flatBtn.gray[data-v-1a7bde1e],
398
+ .btn-icon.flatBtn.gray[data-v-1a7bde1e] {
399
399
  color: var(--bgl-gray);
400
400
  }
401
- .btn.thin[data-v-593b2146] {
401
+ .btn.thin[data-v-1a7bde1e] {
402
402
  padding-left: calc(var(--btn-padding) / 2);
403
403
  padding-right: calc(var(--btn-padding) / 2);
404
404
  }
405
- .btn.round[data-v-593b2146] {
405
+ .btn.round[data-v-1a7bde1e] {
406
406
  border-radius: calc(var(--btn-border-radius) * 2);
407
407
  }
408
- .btn-icon.thin[data-v-593b2146] {
408
+ .btn-icon.thin[data-v-1a7bde1e] {
409
409
  height: calc(var(--btn-height) / 1.5);
410
410
  width: calc(var(--btn-height) / 1.5);
411
411
  line-height: 1;
412
412
  }
413
- [dir="rtl"] .icon-font[data-v-593b2146] {
413
+ [dir="rtl"] .icon-font[data-v-1a7bde1e] {
414
414
  transform: rotateY(180deg);
415
415
  }
416
- .btn-border[data-v-593b2146] {
417
- outline: 1px solid var(--bfb3f9c4);
418
- color: var(--bfb3f9c4);
416
+ .btn-border[data-v-1a7bde1e] {
417
+ outline: 1px solid var(--566fc0e2);
418
+ color: var(--566fc0e2);
419
419
  background: transparent;
420
420
  }
421
- .btn-border[data-v-593b2146]:hover {
421
+ .btn-border[data-v-1a7bde1e]:hover {
422
422
  color: var(--bgl-white);
423
- background: var(--bfb3f9c4);
423
+ background: var(--566fc0e2);
424
424
  filter: brightness(100%);
425
425
  }
426
- .btn-border[data-v-593b2146]:active {
426
+ .btn-border[data-v-1a7bde1e]:active {
427
427
  filter: brightness(80%);
428
428
  }
429
429
  .bg-dark {
@@ -434,23 +434,28 @@
434
434
  bottom: 0;
435
435
  background-color: rgba(0, 0, 0, 0.7);
436
436
  z-index: 999;
437
- display: flex;
438
- justify-content: center;
439
- align-items: center;
440
437
  pointer-events: none;
441
438
  opacity: 0;
442
439
  transition: all ease-in-out 0.3s;
440
+ max-height: 100vh;
443
441
  overflow: auto;
442
+ margin: 0 auto;
443
+ width: 100%;
444
+ text-align: center;
445
+ display: grid;
446
+ align-items: center;
444
447
  }
445
448
 
449
+
446
450
  .modal {
447
451
  width: 96%;
448
452
  max-width: 680px;
449
453
  transform: scale(0.5);
450
454
  opacity: 0;
451
455
  transition: all ease-in-out 0.15s;
452
- margin-top: 6rem;
453
- margin-bottom: 4rem;
456
+ margin-left: auto;
457
+ margin-right: auto;
458
+ height: fit-content;
454
459
  }
455
460
 
456
461
  .small-modal .modal {
@@ -465,7 +470,7 @@
465
470
  position: -webkit-sticky;
466
471
  position: sticky;
467
472
  padding-top: 1rem;
468
- top: -2rem;
473
+ top: 0rem;
469
474
  z-index: 3;
470
475
  background: var(--bgl-white);
471
476
  }
@@ -478,13 +483,17 @@
478
483
  inset-inline-end: -600px;
479
484
  transform: scale(1);
480
485
  opacity: 1;
481
- position: fixed;
482
- top: 20px;
483
- bottom: 20px;
486
+ /* position: fixed; */
487
+ /* top: 20px; */
488
+ /* bottom: 20px; */
484
489
  max-width: 600px;
485
490
  width: 90%;
486
- margin-top: 0;
487
- margin-bottom: 0;
491
+ margin-top: 20px;
492
+ margin-bottom: 20px;
493
+ margin-inline-start: auto;
494
+ margin-inline-end: 20px;
495
+ min-height: calc(100vh - 40px);
496
+
488
497
  }
489
498
 
490
499
  .is-active .modal {
@@ -504,6 +513,7 @@
504
513
 
505
514
  .is-side.bg-dark.is-active {
506
515
  opacity: 1;
516
+ align-items: stretch;
507
517
  }
508
518
 
509
519
  .is-side.is-active .modal {
@@ -512,20 +522,21 @@
512
522
 
513
523
  @media screen and (max-width: 910px) {
514
524
  .tool-bar {
515
- margin: -2rem 0 1rem;
525
+ margin: -1rem 0rem 1rem;
526
+ padding-bottom: 1rem;
516
527
  align-items: center;
517
528
  }
518
529
 
519
530
  .is-active.is-side .modal {
520
- inset-inline-end: 5%;
531
+ margin-inline-end: 5%;
532
+ margin-inline-start: 5%;
521
533
  }
522
534
  }
523
-
524
- .modal-title[data-v-6badff9e] {
535
+ .modal-title[data-v-766bb68f] {
525
536
  margin-top: 0.5rem;
526
537
  }
527
538
  @media screen and (max-width: 910px) {
528
- .modal-title[data-v-6badff9e] {
539
+ .modal-title[data-v-766bb68f] {
529
540
  margin-top: 1rem;
530
541
  }
531
542
  }
@@ -716,37 +727,37 @@
716
727
  border-radius: var(--btn-border-radius);
717
728
  }
718
729
 
719
- .list-arrows[data-v-a167604a] {
730
+ .list-arrows[data-v-56ec9012] {
720
731
  opacity: 0;
721
732
  }
722
- .list-arrows .icon-font[data-v-a167604a] {
733
+ .list-arrows .icon-font[data-v-56ec9012] {
723
734
  transition: all ease-in-out 0.2s;
724
735
  }
725
- .list-arrows.sorted[data-v-a167604a] {
736
+ .list-arrows.sorted[data-v-56ec9012] {
726
737
  opacity: 1;
727
738
  }
728
- .col img[data-v-a167604a] {
739
+ .col img[data-v-56ec9012] {
729
740
  height: 35px;
730
741
  margin-top: -14px;
731
742
  margin-bottom: -14px;
732
743
  border-radius: 5px;
733
744
  }
734
- .list-arrows.sorted .desc[data-v-a167604a] {
745
+ .list-arrows.sorted .desc[data-v-56ec9012] {
735
746
  transform: rotate(180deg);
736
747
  }
737
- table[data-v-a167604a] {
748
+ table[data-v-56ec9012] {
738
749
  border-collapse: separate;
739
750
  border-spacing: 0 15px;
740
751
  border-collapse: collapse;
741
752
  }
742
- th[data-v-a167604a] {
753
+ th[data-v-56ec9012] {
743
754
  font-weight: 400;
744
755
  }
745
- .row[data-v-a167604a] {
756
+ .row[data-v-56ec9012] {
746
757
  border-bottom: 1px solid var(--border-color);
747
758
  cursor: pointer;
748
759
  }
749
- .row.first-row[data-v-a167604a] {
760
+ .row.first-row[data-v-56ec9012] {
750
761
  font-size: 0.8rem;
751
762
  color: var(--bgl-black-tint);
752
763
  position: sticky;
@@ -756,7 +767,7 @@ th[data-v-a167604a] {
756
767
  height: 50px;
757
768
  vertical-align: bottom;
758
769
  }
759
- .row.first-row[data-v-a167604a]::after {
770
+ .row.first-row[data-v-56ec9012]::after {
760
771
  content: "";
761
772
  border-bottom: 1px solid var(--border-color);
762
773
  position: absolute;
@@ -764,11 +775,11 @@ th[data-v-a167604a] {
764
775
  right: 0;
765
776
  bottom: -1px;
766
777
  }
767
- .first-row .col[data-v-a167604a] {
778
+ .first-row .col[data-v-56ec9012] {
768
779
  cursor: pointer;
769
780
  background: var(--bgl-white);
770
781
  }
771
- .col[data-v-a167604a] {
782
+ .col[data-v-56ec9012] {
772
783
  white-space: nowrap;
773
784
  padding: 14px;
774
785
  transition: var(--bgl-transition);
@@ -777,16 +788,16 @@ th[data-v-a167604a] {
777
788
  padding-right: 1rem;
778
789
  align-items: center;
779
790
  }
780
- .col>div[data-v-a167604a] {
791
+ .col>div[data-v-56ec9012] {
781
792
  display: flex;
782
793
  gap: 0.5rem;
783
794
  }
784
- .max-col-width[data-v-a167604a] {
795
+ .max-col-width[data-v-56ec9012] {
785
796
  max-width: 30vw;
786
797
  overflow: hidden;
787
798
  text-overflow: ellipsis;
788
799
  }
789
- .col.check .icon-font[data-v-a167604a] {
800
+ .col.check .icon-font[data-v-56ec9012] {
790
801
  border-radius: 100%;
791
802
  background: var(--bgl-blue-20);
792
803
  color: var(--bgl-primary);
@@ -797,27 +808,27 @@ th[data-v-a167604a] {
797
808
  justify-content: center;
798
809
  margin-top: -2px;
799
810
  }
800
- .rows[data-v-a167604a] {
811
+ .rows[data-v-56ec9012] {
801
812
  font-size: 0.8125em;
802
813
  }
803
- .table-list[data-v-a167604a] {
814
+ .table-list[data-v-56ec9012] {
804
815
  height: 100%;
805
816
  position: relative;
806
817
  padding-left: 0 !important;
807
818
  padding-right: 0 !important;
808
819
  overflow: auto;
809
820
  }
810
- .BagelTable .table-list[data-v-a167604a] {
821
+ .BagelTable .table-list[data-v-56ec9012] {
811
822
  overflow: unset;
812
823
  }
813
- .row-item[data-v-a167604a] {
824
+ .row-item[data-v-56ec9012] {
814
825
  height: 50px;
815
826
  transition: all 200ms ease;
816
827
  }
817
- .row-item[data-v-a167604a]:hover {
828
+ .row-item[data-v-56ec9012]:hover {
818
829
  background: var(--bgl-gray-light);
819
830
  }
820
- .infinite-wrapper[data-v-a167604a] {
831
+ .infinite-wrapper[data-v-56ec9012] {
821
832
  overflow-y: auto;
822
833
  width: 100%;
823
834
  }
@@ -2859,10 +2870,17 @@ h6 {}
2859
2870
  font-weight: 600;
2860
2871
  font-size: 20px;
2861
2872
  margin-top: 0.5rem;
2862
- margin-bottom: 20px;
2873
+ margin-bottom: 0 !important;
2863
2874
  width: 100%;
2864
2875
  -webkit-padding-end: 40px;
2865
2876
  padding-inline-end: 40px;
2877
+ line-height: 2;
2878
+ display: -webkit-box;
2879
+ max-width: 100%;
2880
+ -webkit-line-clamp: 1;
2881
+ -webkit-box-orient: vertical;
2882
+ overflow: hidden;
2883
+ text-overflow: ellipsis;
2866
2884
  }
2867
2885
  .modal-footer {
2868
2886
  gap: 1rem;
@@ -2870,6 +2888,13 @@ h6 {}
2870
2888
  justify-content: space-between;
2871
2889
  align-items: center;
2872
2890
  }
2891
+ .modal-footer>div {
2892
+ gap: 1rem;
2893
+ display: flex;
2894
+ justify-content: space-between;
2895
+ align-items: center;
2896
+ gap: 0;
2897
+ }
2873
2898
  * {
2874
2899
  box-sizing: border-box;
2875
2900
  }
@@ -3180,7 +3205,7 @@ h6 {}
3180
3205
  }
3181
3206
  .list-view {
3182
3207
  grid-area: list-view;
3183
- grid-template-areas: "list-header" "list-content";
3208
+ grid-template-areas: "list-header""list-content";
3184
3209
  grid-template-columns: 1fr;
3185
3210
  overflow-y: auto;
3186
3211
  grid-template-rows: -webkit-max-content 1fr;
@@ -3204,7 +3229,7 @@ h6 {}
3204
3229
  transform: translateX(-20px);
3205
3230
  opacity: 0;
3206
3231
  }
3207
- .grid > * {
3232
+ .grid>* {
3208
3233
  min-height: 0;
3209
3234
  }
3210
3235
  .view-wrapper {
@@ -1,5 +1,5 @@
1
1
  export type { MaterialIcons } from './materialIcons';
2
- export type { Tables, TableToTypeMapping } from '@bagelink/sdk';
2
+ export type { Tables, TableToTypeMapping } from '../../../sdk/src/index.ts';
3
3
  export type { StorageFile } from './file';
4
4
  export type { NavLink } from '../components/NavBar.vue';
5
5
  export * from './BtnOptions';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bagelink/vue",
3
3
  "type": "module",
4
- "version": "0.0.237",
4
+ "version": "0.0.241",
5
5
  "description": "Bagel core sdk packages",
6
6
  "author": {
7
7
  "name": "Neveh Allon",
@@ -51,8 +51,8 @@
51
51
  "./vite.config.ts"
52
52
  ],
53
53
  "devDependencies": {
54
- "@vue-macros/reactivity-transform": "^0.4.1",
55
- "vue": "^3.4.3"
54
+ "@vue-macros/reactivity-transform": "^0.4.3",
55
+ "vue": "^3.4.15"
56
56
  },
57
57
  "peerDependencies": {
58
58
  "@bagelink/sdk": "*",
@@ -113,7 +113,7 @@
113
113
  "access": "public"
114
114
  },
115
115
  "dependencies": {
116
- "type-fest": "^4.10.1",
116
+ "type-fest": "^4.10.2",
117
117
  "vue-multiselect": "3.0.0-beta.3"
118
118
  },
119
119
  "scripts": {
@@ -59,7 +59,10 @@ const props = withDefaults(
59
59
  );
60
60
 
61
61
  const computedTheme = $computed(
62
- () => (props?.color || props?.theme),
62
+ () => {
63
+ if (props.disabled) return 'gray-light';
64
+ return (props?.color || props?.theme);
65
+ },
63
66
  );
64
67
 
65
68
  const computedDefaultColors = $computed(
@@ -1,6 +1,8 @@
1
1
  <template>
2
- <div class="bg-dark" :class="{ 'is-side': side, 'is-active': isActive }"
3
- @click="() => (dismissable ? closeModal() : '')" @keydown.esc="closeModal">
2
+ <div
3
+ class="bg-dark" :class="{ 'is-side': side, 'is-active': isActive }"
4
+ @click="() => (dismissable ? closeModal() : '')" @keydown.esc="closeModal"
5
+ >
4
6
  <Card class="modal" @click.stop>
5
7
  <header class="tool-bar">
6
8
  <slot name="toolbar" />
@@ -1,12 +1,39 @@
1
1
  <template>
2
- <Modal :side="side" ref="modal" :dismissable="dismissable" :title="title">
3
- <BagelForm v-model="formData" :schema="computedFormSchema" />
4
- <template #footer v-if="onDelete || onSubmit">
2
+ <Modal
3
+ :side="side"
4
+ ref="modal"
5
+ :dismissable="dismissable"
6
+ :title="title"
7
+ >
8
+ <BagelForm
9
+ v-model="formData"
10
+ :schema="computedFormSchema"
11
+ />
12
+ <template
13
+ #footer
14
+ v-if="onDelete || onSubmit"
15
+ >
5
16
  <div>
6
- <Btn flat value="Cancel" @click="closeModal()" />
7
- <Btn icon="delete" v-if="onDelete" flat value="Delete" @click="runDelete()" color="red" />
17
+ <Btn
18
+ thin
19
+ flat
20
+ value="Cancel"
21
+ @click="closeModal()"
22
+ />
23
+ <Btn
24
+ thin
25
+ icon="delete"
26
+ v-if="onDelete"
27
+ flat
28
+ value="Delete"
29
+ @click="runDelete()"
30
+ color="red"
31
+ />
8
32
  </div>
9
- <Btn value="Submit" @click="runSubmit()" />
33
+ <Btn
34
+ value="Submit"
35
+ @click="runSubmit()"
36
+ />
10
37
  </template>
11
38
  </Modal>
12
39
  </template>
@@ -2,62 +2,21 @@
2
2
  <div class="table-list-wrap h-100">
3
3
  <table class="infinite-wrapper">
4
4
  <thead class="row first-row">
5
- <th
6
- class="col"
7
- v-for="field in computedSchema"
8
- :key="field.id"
9
- @click="sort(field?.id || '')"
10
- >
5
+ <th class="col" v-for="field in computedSchema" :key="field.id" @click="sort(field?.id || '')">
11
6
  <div class="flex">
12
7
  {{ field.id }}
13
- <div
14
- class="list-arrows"
15
- :class="{ sorted: sortField === field.id }"
16
- >
17
- <MaterialIcon
18
- :class="{ desc: sortDirection === 'DESC' }"
19
- icon="keyboard_arrow_up"
20
- />
8
+ <div class="list-arrows" :class="{ sorted: sortField === field.id }">
9
+ <MaterialIcon :class="{ desc: sortDirection === 'DESC' }" icon="keyboard_arrow_up" />
21
10
  </div>
22
11
  </div>
23
12
  </th>
24
13
  </thead>
25
- <tbody
26
- ref="infinite"
27
- class="rows infinite"
28
- :class="{ loading }"
29
- >
30
- <tr
31
- @click="selectElement(row)"
32
- class="row row-item position-relative"
33
- v-for="row in data"
34
- :key="row.id"
35
- >
36
- <td
37
- class="col"
38
- v-for="field in computedSchema"
39
- :key="`${field.id}-${row.id}`"
40
- >
41
- <slot
42
- v-if="field.id && slots[field.id]"
43
- :name="field.id"
44
- :row="row"
45
- :field="field"
46
- />
14
+ <tbody ref="infinite" class="rows infinite" :class="{ loading }">
15
+ <tr v-for="row in data" :key="row.id" @click="selectElement(row)" class="row row-item position-relative">
16
+ <td class="col" v-for="field in computedSchema" :key="`${field.id}-${row.id}`">
17
+ <slot v-if="field.id && slots[field.id]" :name="field.id" :row="row" :field="field" />
47
18
  <div v-else>
48
- <component
49
- :is="field.$el || 'div'"
50
- v-if="iffer(field, row)"
51
- v-bind="bindAttrs(field.attrs, denullify(row, field.id), row)"
52
- :class="classify(denullify(row, field.id), row, field.class, field.attrs?.class)"
53
- :src="field.$el === 'img' && field.id ? row[field.id]?.url : ''"
54
- :modelValue="field.id ? row[field.id] : ''"
55
- @update:modelValue="($event: any) => field?.onUpdate?.($event, denullify(row, field.id), row)"
56
- >
57
- {{
58
- field?.transform?.(denullify(row, field.id), row) || denullify(row, field.id) || ""
59
- }}
60
- </component>
19
+ <BglField :field="field" :modelValue="row" />
61
20
  </div>
62
21
  </td>
63
22
  </tr>
@@ -71,11 +30,8 @@
71
30
  import { useSlots } from 'vue';
72
31
  import {
73
32
  type BglFormSchemaT,
74
- bindAttrs,
75
- classify,
76
- denullify,
77
33
  MaterialIcon,
78
- iffer,
34
+ BglField,
79
35
  } from '@bagelink/vue';
80
36
 
81
37
  const slots = useSlots();
@@ -93,7 +49,7 @@ const computedSchema = $computed(() => {
93
49
  return props.schema;
94
50
  });
95
51
 
96
- const emit = defineEmits(['select']);
52
+ const emit = defineEmits(['select', 'orderBy']);
97
53
 
98
54
  const selectElement = (data: Record<string, any>) => emit('select', data);
99
55
 
@@ -108,6 +64,7 @@ const sort = (fieldname: string) => {
108
64
  sortField = fieldname;
109
65
  sortDirection = 'ASC';
110
66
  }
67
+ emit('orderBy', `${fieldname} ${sortDirection}`.trim());
111
68
  };
112
69
  </script>
113
70
 
@@ -1,11 +1,26 @@
1
1
  <template>
2
- <component :required="field.required" v-bind="bindAttrs(field?.attrs || {}, fieldData, modelValue)"
3
- :class="classify(fieldData, modelValue, field.class, field.attrs?.class)" v-if="iffer(field, fieldData)" :is="is"
4
- :label="field.label" :id="field.id" :placeholder="field.placeholder || field.label" v-model="fieldData"
5
- :defaultValue="field.defaultValue" :options="field.options" :hint="field.hint"
6
- @update:modelValue="($event: any) => field?.onUpdate?.($event, denullify(fieldData, field.id), formData)">
2
+ <component
3
+ :required="field.required"
4
+ v-bind="bindAttrs(field?.attrs || {}, fieldData, modelValue)"
5
+ :class="classify(fieldData, modelValue, field.class, field.attrs?.class)"
6
+ v-if="iffer(field, fieldData)"
7
+ :is="is"
8
+ :label="field.label"
9
+ :id="field.id"
10
+ :placeholder="field.placeholder || field.label"
11
+ v-model="fieldData"
12
+ :defaultValue="field.defaultValue"
13
+ :options="field.options"
14
+ :hint="field.hint"
15
+ @update:modelValue="($event: any) => field?.onUpdate?.($event, denullify(fieldData, field.id), formData)"
16
+ >
7
17
  {{ field.transform?.(fieldData, modelValue) || fieldData || '' }}
8
- <BglField v-model="formData" v-for="(child, ii) in field.children" :key="child.id || ii" :field="child" />
18
+ <BglField
19
+ v-model="formData"
20
+ v-for="(child, ii) in field.children"
21
+ :key="child.id || ii"
22
+ :field="child"
23
+ />
9
24
  </component>
10
25
  </template>
11
26