@zeedhi/common 1.39.1 → 1.43.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 (67) hide show
  1. package/dist/style.css +1 -1
  2. package/dist/zd-common.esm.js +868 -251
  3. package/dist/zd-common.umd.js +873 -253
  4. package/package.json +2 -2
  5. package/types/components/index.d.ts +2 -0
  6. package/types/components/zd-alert/alert.d.ts +2 -0
  7. package/types/components/zd-apex-chart/apex-chart.d.ts +163 -1
  8. package/types/components/zd-apex-chart/interfaces.d.ts +35 -3
  9. package/types/components/zd-breadcrumbs/breadcrumbs.d.ts +0 -8
  10. package/types/components/zd-button/button.d.ts +0 -8
  11. package/types/components/zd-button/interfaces.d.ts +0 -2
  12. package/types/components/zd-button-group/button-group.d.ts +0 -8
  13. package/types/components/zd-button-group/interfaces.d.ts +0 -2
  14. package/types/components/zd-card/card.d.ts +0 -8
  15. package/types/components/zd-card/interfaces.d.ts +0 -2
  16. package/types/components/zd-carousel/carousel.d.ts +10 -8
  17. package/types/components/zd-carousel/interfaces.d.ts +2 -2
  18. package/types/components/zd-code-editor/code-editor.d.ts +5 -1
  19. package/types/components/zd-code-editor/interfaces.d.ts +2 -1
  20. package/types/components/zd-component/component.d.ts +8 -0
  21. package/types/components/zd-component/interfaces.d.ts +2 -0
  22. package/types/components/zd-container/container.d.ts +12 -0
  23. package/types/components/zd-container/interfaces.d.ts +3 -0
  24. package/types/components/zd-date/date-range.d.ts +1 -5
  25. package/types/components/zd-dialog/dialog.d.ts +11 -0
  26. package/types/components/zd-dialog/interfaces.d.ts +2 -0
  27. package/types/components/zd-divider/divider.d.ts +0 -8
  28. package/types/components/zd-divider/interfaces.d.ts +0 -2
  29. package/types/components/zd-dropdown/dropdown.d.ts +4 -0
  30. package/types/components/zd-dropdown/interfaces.d.ts +1 -0
  31. package/types/components/zd-footer/footer.d.ts +0 -8
  32. package/types/components/zd-footer/interfaces.d.ts +0 -2
  33. package/types/components/zd-form/form.d.ts +14 -1
  34. package/types/components/zd-form/interfaces.d.ts +1 -0
  35. package/types/components/zd-frame/frame.d.ts +4 -0
  36. package/types/components/zd-frame/interfaces.d.ts +3 -0
  37. package/types/components/zd-grid/grid-column.d.ts +2 -0
  38. package/types/components/zd-grid/grid-editable.d.ts +11 -1
  39. package/types/components/zd-grid/grid.d.ts +4 -0
  40. package/types/components/zd-grid/interfaces.d.ts +1 -0
  41. package/types/components/zd-header/header.d.ts +0 -8
  42. package/types/components/zd-icon/icon.d.ts +0 -8
  43. package/types/components/zd-icon/interfaces.d.ts +0 -2
  44. package/types/components/zd-input/input.d.ts +0 -8
  45. package/types/components/zd-list/interfaces.d.ts +3 -2
  46. package/types/components/zd-list/list.d.ts +12 -8
  47. package/types/components/zd-login/interfaces.d.ts +0 -1
  48. package/types/components/zd-login/login.d.ts +0 -4
  49. package/types/components/zd-menu/interfaces.d.ts +0 -1
  50. package/types/components/zd-menu/menu.d.ts +0 -4
  51. package/types/components/zd-progress/progress.d.ts +0 -8
  52. package/types/components/zd-select-tree/interfaces.d.ts +1 -0
  53. package/types/components/zd-select-tree/select-tree.d.ts +6 -0
  54. package/types/components/zd-selectable-list/interfaces.d.ts +8 -0
  55. package/types/components/zd-selectable-list/selectable-list.d.ts +29 -0
  56. package/types/components/zd-steppers/interfaces.d.ts +0 -2
  57. package/types/components/zd-steppers/steppers.d.ts +0 -8
  58. package/types/components/zd-tabs/interfaces.d.ts +1 -0
  59. package/types/components/zd-tabs/tabs.d.ts +14 -0
  60. package/types/components/zd-tree-grid/tree-grid-editable.d.ts +3 -0
  61. package/types/utils/report/index.d.ts +2 -0
  62. package/types/utils/report/report-type/base-report.d.ts +3 -1
  63. package/types/utils/report/report-type/interfaces.d.ts +2 -1
  64. package/types/utils/report/report-type/xls-report.d.ts +1 -16
  65. package/types/utils/report/report-type/xls2-report.d.ts +16 -0
  66. package/types/utils/report/report-type/xls3-report.d.ts +16 -0
  67. package/types/utils/themes/themes.d.ts +4 -0
@@ -1,7 +1,7 @@
1
- import { AccessorManager, Event, KeyMap, Metadata, FormatterParserProvider, Validation, Accessor, DatasourceFactory, I18n, MethodNotAssignedError, Loader, Mask, Config, dayjs, isEqual, Router, InstanceNotFoundError, Http, Cookie, normalize, URL as URL$1 } from '@zeedhi/core';
1
+ import { AccessorManager, Event, KeyMap, Metadata, FormatterParserProvider, Validation, Accessor, DatasourceFactory, I18n, MethodNotAssignedError, Loader, Mask, Config, dayjs, Utils, Router, InstanceNotFoundError, Http, Cookie, URL as URL$1 } from '@zeedhi/core';
2
+ import merge from 'lodash.merge';
2
3
  import debounce from 'lodash.debounce';
3
4
  import isUndefined from 'lodash.isundefined';
4
- import merge from 'lodash.merge';
5
5
  import set from 'lodash.set';
6
6
 
7
7
  /**
@@ -48,6 +48,14 @@ class Component {
48
48
  * Controls component visibility.
49
49
  */
50
50
  this.isVisible = true;
51
+ /**
52
+ * Applies the dark theme variant to the component.
53
+ */
54
+ this.dark = false;
55
+ /**
56
+ * Applies the light theme variant to the component.
57
+ */
58
+ this.light = false;
51
59
  /**
52
60
  * Define component key mapping
53
61
  */
@@ -63,6 +71,8 @@ class Component {
63
71
  this.cssClass = this.getInitValue('cssClass', props.cssClass, this.cssClass);
64
72
  this.cssStyle = this.getInitValue('cssStyle', props.cssStyle, this.cssStyle);
65
73
  this.isVisible = this.getInitValue('isVisible', props.isVisible, this.isVisible);
74
+ this.dark = this.getInitValue('dark', props.dark, this.dark);
75
+ this.light = this.getInitValue('light', props.light, this.light);
66
76
  this.children = Array.isArray(props.children) ? props.children : this.children;
67
77
  this.keyMap = KeyMap.factory(props.keyMap || this.keyMap);
68
78
  this.createAccessors();
@@ -298,6 +308,8 @@ class Alert extends Component {
298
308
  this.vertical = false;
299
309
  this.defaultValues = {
300
310
  name: this.name,
311
+ dark: this.dark,
312
+ light: this.light,
301
313
  color: this.color,
302
314
  text: this.text,
303
315
  timeout: this.timeout,
@@ -322,6 +334,8 @@ class Alert extends Component {
322
334
  assignAlertProperties(alert) {
323
335
  this.name = this.getInitValue('name', alert.name, this.defaultValues.name);
324
336
  this.color = this.getInitValue('color', alert.color, this.defaultValues.color);
337
+ this.dark = this.getInitValue('dark', alert.dark, this.defaultValues.dark);
338
+ this.light = this.getInitValue('light', alert.light, this.defaultValues.light);
325
339
  this.text = this.getInitValue('text', alert.text, this.defaultValues.text);
326
340
  this.timeout = this.getInitValue('timeout', alert.timeout, this.defaultValues.timeout);
327
341
  this.type = this.getInitValue('type', alert.type, this.defaultValues.type);
@@ -410,8 +424,43 @@ class ApexChart extends ComponentRender {
410
424
  * Defines the load progress color
411
425
  */
412
426
  this.loadColor = 'primary';
427
+ this.defaultOptions = {
428
+ chart: {
429
+ toolbar: {
430
+ tools: {
431
+ download: 'fileDownload',
432
+ selection: 'zoomSelection',
433
+ zoom: 'zoom',
434
+ zoomin: 'zoomIn',
435
+ zoomout: 'zoomOut',
436
+ pan: 'zoomPanning',
437
+ reset: 'zoomReset',
438
+ },
439
+ },
440
+ events: {
441
+ animationEnd: this.animationEndEvent.bind(this),
442
+ beforeMount: this.beforeMountEvent.bind(this),
443
+ mounted: this.mountedEvent.bind(this),
444
+ updated: this.updatedEvent.bind(this),
445
+ click: this.clickEvent.bind(this),
446
+ mouseMove: this.mouseMoveEvent.bind(this),
447
+ mouseLeave: this.mouseLeaveEvent.bind(this),
448
+ legendClick: this.legendClickEvent.bind(this),
449
+ markerClick: this.markerClickEvent.bind(this),
450
+ selection: this.selectionEvent.bind(this),
451
+ dataPointSelection: this.dataPointSelectionEvent.bind(this),
452
+ dataPointMouseEnter: this.dataPointMouseEnterEvent.bind(this),
453
+ dataPointMouseLeave: this.dataPointMouseLeaveEvent.bind(this),
454
+ beforeZoom: this.beforeZoomEvent.bind(this),
455
+ beforeResetZoom: this.beforeResetZoomEvent.bind(this),
456
+ zoomed: this.zoomedEvent.bind(this),
457
+ scrolled: this.scrolledEvent.bind(this),
458
+ brushScrolled: this.brushScrolledEvent.bind(this),
459
+ },
460
+ },
461
+ };
413
462
  this.chartType = this.getInitValue('chartType', props.chartType, this.chartType);
414
- this.options = this.getInitValue('options', props.options, this.options);
463
+ this.options = merge(this.defaultOptions, this.getInitValue('options', props.options, this.options));
415
464
  this.series = this.getInitValue('series', props.series, this.series);
416
465
  this.height = this.getInitValue('height', props.height, this.height);
417
466
  this.width = this.getInitValue('width', props.width, this.width);
@@ -428,6 +477,14 @@ class ApexChart extends ComponentRender {
428
477
  setViewUpdate(viewUpdate) {
429
478
  this.viewUpdate = viewUpdate;
430
479
  }
480
+ /**
481
+ * Sets view get icon HTML method.
482
+ * @param viewGetIconHTML Update method
483
+ */
484
+ setViewGetIconHTML(viewGetIconHTML) {
485
+ this.viewGetIconHTML = viewGetIconHTML;
486
+ this.updateToolbarIcons();
487
+ }
431
488
  /**
432
489
  * Update the chart
433
490
  * @param options New options
@@ -442,6 +499,249 @@ class ApexChart extends ComponentRender {
442
499
  }
443
500
  return Promise.resolve();
444
501
  }
502
+ /**
503
+ * Fires when the chart’s initial animation is finished
504
+ * @param chartContext
505
+ * @param config
506
+ * @param element DOM Element
507
+ */
508
+ animationEndEvent(chartContext, options) {
509
+ this.callEvent('chartAnimationEnd', { component: this, chartContext, options });
510
+ }
511
+ /**
512
+ * Fires before the chart has been drawn on screen
513
+ * @param chartContext
514
+ * @param config
515
+ * @param element DOM Element
516
+ */
517
+ beforeMountEvent(chartContext, config) {
518
+ this.callEvent('chartBeforeMount', {
519
+ component: this, chartContext, config,
520
+ });
521
+ }
522
+ /**
523
+ * Fires after the chart has been drawn on screen
524
+ * @param chartContext
525
+ * @param config
526
+ * @param element DOM Element
527
+ */
528
+ mountedEvent(chartContext, config) {
529
+ this.callEvent('chartMounted', {
530
+ component: this, chartContext, config,
531
+ });
532
+ }
533
+ /**
534
+ * Fires when the chart has been dynamically updated either with
535
+ * updateOptions() or updateSeries() functions
536
+ * @param chartContext
537
+ * @param config
538
+ * @param element DOM Element
539
+ */
540
+ updatedEvent(chartContext, config) {
541
+ this.callEvent('chartUpdated', {
542
+ component: this, chartContext, config,
543
+ });
544
+ }
545
+ /**
546
+ * Fires when the chart has been dynamically updated either with
547
+ * updateOptions() or updateSeries() functions
548
+ * @param event Event that triggered the click event
549
+ * @param chartContext
550
+ * @param config
551
+ * @param element DOM Element
552
+ */
553
+ clickEvent(event, chartContext, config) {
554
+ this.callEvent('chartClick', {
555
+ event, component: this, chartContext, config,
556
+ });
557
+ }
558
+ /**
559
+ * Fires when user moves mouse on any area of the chart.
560
+ * @param event Event that triggered the click event
561
+ * @param chartContext
562
+ * @param config
563
+ * @param element DOM Element
564
+ */
565
+ mouseMoveEvent(event, chartContext, config) {
566
+ this.callEvent('chartMouseMove', {
567
+ event, component: this, chartContext, config,
568
+ });
569
+ }
570
+ /**
571
+ * Fires when user moves mouse on any area of the chart.
572
+ * @param event Event that triggered the mouse leave
573
+ * @param chartContext
574
+ * @param config New config
575
+ * @param element DOM Element
576
+ */
577
+ mouseLeaveEvent(event, chartContext, config) {
578
+ this.callEvent('chartMouseLeave', {
579
+ event, component: this, chartContext, config,
580
+ });
581
+ }
582
+ /**
583
+ * Fires when user moves mouse on any area of the chart.
584
+ * @param chartContext
585
+ * @param seriesIndex
586
+ * @param config
587
+ * @param element DOM Element
588
+ */
589
+ legendClickEvent(chartContext, seriesIndex, config) {
590
+ this.callEvent('chartLegendClick', {
591
+ component: this, chartContext, seriesIndex, config,
592
+ });
593
+ }
594
+ /**
595
+ * Fires when user moves mouse on any area of the chart.
596
+ * @param event Event that triggered the marker click
597
+ * @param chartContext
598
+ * @param option New config
599
+ * @param element DOM Element
600
+ */
601
+ markerClickEvent(event, chartContext, config) {
602
+ this.callEvent('chartMarkerClick', {
603
+ event, component: this, chartContext, config,
604
+ });
605
+ }
606
+ /**
607
+ * Fires when user selects rect using the selection tool.
608
+ * The second argument
609
+ * @param chartContext
610
+ * @param config contains the yaxis and xaxis coordinates where user made the selection
611
+ * @param element DOM Element
612
+ */
613
+ selectionEvent(chartContext, config) {
614
+ this.callEvent('chartSelection', {
615
+ component: this, chartContext, config,
616
+ });
617
+ }
618
+ /**
619
+ * Fires when user clicks on a datapoint (bar/column/marker/bubble/donut-slice).
620
+ * @param event Event that triggered when user clicks on a datapoint
621
+ * @param chartContext
622
+ * @param config The config object, also includes additional information like
623
+ * which dataPointIndex was selected of which series.
624
+ * @param element DOM Element
625
+ */
626
+ dataPointSelectionEvent(event, chartContext, config) {
627
+ this.callEvent('chartDataPointSelection', {
628
+ event, component: this, chartContext, config,
629
+ });
630
+ }
631
+ /**
632
+ * Fires when user clicks on a datapoint (bar/column/marker/bubble/donut-slice).
633
+ * @param event Event that triggered when user’s mouse enter on a datapoint
634
+ * @param chartContext
635
+ * @param config The config object, also includes additional information like
636
+ * which dataPointIndex was hovered of particular series.
637
+ * @param element DOM Element
638
+ */
639
+ dataPointMouseEnterEvent(event, chartContext, config) {
640
+ this.callEvent('chartDataPointMouseEnter', {
641
+ event, component: this, chartContext, config,
642
+ });
643
+ }
644
+ /**
645
+ * MouseLeave event for a datapoint (bar/column/marker/bubble/donut-slice).
646
+ * @param event Event that triggered the beforeSlide event
647
+ * @param chartContext
648
+ * @param config
649
+ * @param element DOM Element
650
+ */
651
+ dataPointMouseLeaveEvent(event, chartContext, config) {
652
+ this.callEvent('chartDataPointMouseLeave', {
653
+ event, component: this, chartContext, config,
654
+ });
655
+ }
656
+ /**
657
+ * This function, if defined, runs just before zooming in/out of the chart
658
+ * allowing you to set a custom range for zooming in/out.
659
+ * @param chartContext
660
+ * @param config { min: timestamp, max: timestamp }
661
+ * @param element DOM Element
662
+ */
663
+ beforeZoomEvent(chartContext, config) {
664
+ this.callEvent('chartBeforeZoom', {
665
+ component: this, chartContext, config,
666
+ });
667
+ }
668
+ /**
669
+ * This function, if defined, runs just before the user hits the HOME button
670
+ * on the toolbar to reset the chart to it’s original state. The function
671
+ * allows you to set a custom axes range for the initial view of the chart.
672
+ * @param chartContext
673
+ * @param config { min: timestamp, max: timestamp }
674
+ * @param element DOM Element
675
+ */
676
+ beforeResetZoomEvent(chartContext, config) {
677
+ this.callEvent('chartBeforeResetZoom', {
678
+ component: this, chartContext, config,
679
+ });
680
+ }
681
+ /**
682
+ * Fires when user zooms in/out the chart using either the selection zooming
683
+ * tool or zoom in/out buttons.
684
+ * The 2nd argument includes information of the new xaxis/yaxis generated after zooming.
685
+ * @param chartContext
686
+ * @param config { min: timestamp, max: timestamp }
687
+ * @param element DOM Element
688
+ */
689
+ zoomedEvent(chartContext, config) {
690
+ this.callEvent('chartZoomed', {
691
+ component: this, chartContext, config,
692
+ });
693
+ }
694
+ /**
695
+ * Fires when user scrolls using the pan tool.
696
+ * The 2nd argument includes information of the new xaxis generated after scrolling.
697
+ * @param chartContext
698
+ * @param config { xaxis: any }
699
+ * @param element DOM Element
700
+ */
701
+ scrolledEvent(chartContext, config) {
702
+ this.callEvent('chartScrolled', {
703
+ component: this, chartContext, config,
704
+ });
705
+ }
706
+ /**
707
+ * Fires when user drags the brush in a brush chart.
708
+ * The 2nd argument includes information of the new axes generated after
709
+ * scrolling the brush.
710
+ * @param chartContext
711
+ * @param config { xaxis: any, yaxis: any }
712
+ * @param element DOM Element
713
+ */
714
+ brushScrolledEvent(chartContext, config) {
715
+ this.callEvent('chartBrushScrolled', {
716
+ component: this, chartContext, config,
717
+ });
718
+ }
719
+ updateToolbarIcons() {
720
+ var _a, _b, _c;
721
+ if (!this.viewGetIconHTML)
722
+ return this.options;
723
+ const getIconFn = this.viewGetIconHTML;
724
+ let changed = false;
725
+ const newOptions = Object.assign({}, this.options);
726
+ if ((_b = (_a = newOptions.chart) === null || _a === void 0 ? void 0 : _a.toolbar) === null || _b === void 0 ? void 0 : _b.tools) {
727
+ const { tools } = newOptions.chart.toolbar;
728
+ Object.keys(tools).forEach((key) => {
729
+ if (typeof tools[key] === 'string') {
730
+ tools[key] = getIconFn(tools[key]);
731
+ changed = true;
732
+ }
733
+ });
734
+ if ((_c = tools.customIcons) === null || _c === void 0 ? void 0 : _c.length) {
735
+ tools.customIcons.forEach((item) => {
736
+ item.icon = getIconFn(item.icon);
737
+ });
738
+ }
739
+ }
740
+ if (this.viewUpdate && changed) {
741
+ this.viewUpdate(newOptions);
742
+ }
743
+ return newOptions;
744
+ }
445
745
  }
446
746
 
447
747
  /**
@@ -492,10 +792,6 @@ class Breadcrumbs extends ComponentRender {
492
792
  */
493
793
  constructor(props) {
494
794
  super(props);
495
- /**
496
- * Applies the dark theme variant to the component.
497
- */
498
- this.dark = false;
499
795
  /**
500
796
  * Specifies the dividing string between items.
501
797
  */
@@ -512,19 +808,13 @@ class Breadcrumbs extends ComponentRender {
512
808
  * Increase the font-size of the breadcrumb item text to 16px.
513
809
  */
514
810
  this.large = false;
515
- /**
516
- * Applies the light theme variant to the component.
517
- */
518
- this.light = true;
519
811
  /**
520
812
  * Decrease the font-size of the breadcrumb item text to 12px.
521
813
  */
522
814
  this.small = false;
523
- this.dark = this.getInitValue('dark', props.dark, this.dark);
524
815
  this.divider = this.getInitValue('divider', props.divider, this.divider);
525
816
  this.items = this.getInitValue('items', props.items, this.items);
526
817
  this.large = this.getInitValue('large', props.large, this.large);
527
- this.light = this.getInitValue('light', props.light, this.light);
528
818
  this.iconName = this.getInitValue('iconName', props.iconName, this.iconName);
529
819
  this.small = this.getInitValue('small', props.small, this.small);
530
820
  this.createAccessors();
@@ -560,10 +850,6 @@ class Button extends ComponentRender {
560
850
  * It can be the name of material or css color in hexa
561
851
  */
562
852
  this.color = 'primary';
563
- /**
564
- * Applies the dark theme variant to the button
565
- */
566
- this.dark = false;
567
853
  /**
568
854
  * Removes the ability to click or target the button
569
855
  */
@@ -605,10 +891,6 @@ class Button extends ComponentRender {
605
891
  * This should be used with the absolute or fixed props
606
892
  */
607
893
  this.left = false;
608
- /**
609
- * Applies the light theme variant to the button
610
- */
611
- this.light = false;
612
894
  /**
613
895
  * Makes the background transparent and applies a thin border
614
896
  */
@@ -711,10 +993,6 @@ class ButtonGroup extends ComponentRender {
711
993
  * It can be the name of material or css color in hexa
712
994
  */
713
995
  this.color = 'primary';
714
- /**
715
- * Applies the dark theme variant to the component.
716
- */
717
- this.dark = false;
718
996
  /**
719
997
  * Reduces the button size and padding.
720
998
  */
@@ -724,10 +1002,6 @@ class ButtonGroup extends ComponentRender {
724
1002
  * space between the buttons
725
1003
  */
726
1004
  this.group = false;
727
- /**
728
- * Applies the light theme variant to the component.
729
- */
730
- this.light = false;
731
1005
  /**
732
1006
  * Applies mandatory selected button
733
1007
  */
@@ -761,10 +1035,8 @@ class ButtonGroup extends ComponentRender {
761
1035
  this.backgroundColor = this.getInitValue('backgroundColor', props.backgroundColor, this.backgroundColor);
762
1036
  this.borderless = this.getInitValue('block', props.borderless, this.borderless);
763
1037
  this.color = this.getInitValue('color', props.color, this.color);
764
- this.dark = this.getInitValue('dark', props.dark, this.dark);
765
1038
  this.dense = this.getInitValue('disabled', props.dense, this.dense);
766
1039
  this.group = this.getInitValue('group', props.group, this.group);
767
- this.light = this.getInitValue('light', props.light, this.light);
768
1040
  this.mandatory = this.getInitValue('mandatory', props.mandatory, this.mandatory);
769
1041
  this.multiple = this.getInitValue('multiple', props.multiple, this.multiple);
770
1042
  this.rounded = this.getInitValue('rounded', props.rounded, this.rounded);
@@ -818,10 +1090,6 @@ class Carousel extends ComponentRender {
818
1090
  * a non-integer number in slidesPerView, like 1.5)
819
1091
  */
820
1092
  this.center = false;
821
- /**
822
- * Applies the dark theme variant to the carousel pagination
823
- */
824
- this.dark = false;
825
1093
  /**
826
1094
  * Displays the pagination as a fraction in the following format: currentSlide/slidesCount.
827
1095
  * Only works when <code>showPagination</code> property is true
@@ -832,6 +1100,16 @@ class Carousel extends ComponentRender {
832
1100
  * '30em', '400', 400. Values without measurement unit will be notated in pixels by default
833
1101
  */
834
1102
  this.height = 'auto';
1103
+ /**
1104
+ * Sets the carousel max height. Example values: 'auto', '100%', '400px',
1105
+ * '30em', '400', 400. Values without measurement unit will be notated in pixels by default
1106
+ */
1107
+ this.maxHeight = 'none';
1108
+ /**
1109
+ * Sets the carousel min height. Example values: 'auto', '100%', '400px',
1110
+ * '30em', '400', 400. Values without measurement unit will be notated in pixels by default
1111
+ */
1112
+ this.minHeight = 'none';
835
1113
  /**
836
1114
  * Configures the carousel as infinite (the slide after the last one is the first slide, and vice-versa)
837
1115
  */
@@ -848,10 +1126,6 @@ class Carousel extends ComponentRender {
848
1126
  * Allows controlling the carousel using the keyboard arrow keys
849
1127
  */
850
1128
  this.keysControl = true;
851
- /**
852
- * Applies the light theme variant to the carousel
853
- */
854
- this.light = true;
855
1129
  /**
856
1130
  * Allows controlling the carousel using mouse drag
857
1131
  */
@@ -926,14 +1200,14 @@ class Carousel extends ComponentRender {
926
1200
  this.autoPlay = this.getInitValue('autoPlay', props.autoPlay, this.autoPlay);
927
1201
  this.buttonsOutside = this.getInitValue('buttonsOutside', props.buttonsOutside, this.buttonsOutside);
928
1202
  this.center = this.getInitValue('center', props.center, this.center);
929
- this.dark = this.getInitValue('dark', props.dark, this.dark);
930
1203
  this.height = this.getInitValue('height', props.height, this.height);
1204
+ this.maxHeight = this.getInitValue('maxHeight', props.maxHeight, this.maxHeight);
1205
+ this.minHeight = this.getInitValue('minHeight', props.minHeight, this.minHeight);
931
1206
  this.infiniteScroll = this.getInitValue('infiniteScroll', props.infiniteScroll, this.infiniteScroll);
932
1207
  this.initialSlide = this.getInitValue('initialSlide', props.initialSlide, this.initialSlide);
933
1208
  this.currentSlide = this.getInitValue('currentSlide', props.currentSlide, this.initialSlide);
934
1209
  this.interval = this.getInitValue('interval', props.interval, this.interval);
935
1210
  this.keysControl = this.getInitValue('keysControl', props.keysControl, this.keysControl);
936
- this.light = this.getInitValue('light', props.light, this.light);
937
1211
  this.mouseControl = this.getInitValue('mouseControl', props.mouseControl, this.mouseControl);
938
1212
  this.nextButton = props.nextButton || this.nextButton;
939
1213
  this.fractionPagination = this.getInitValue('fractionPagination', props.fractionPagination, this.fractionPagination);
@@ -1048,10 +1322,6 @@ class Card extends ComponentRender {
1048
1322
  * Applies specified color to the control. It can be the name of material color
1049
1323
  */
1050
1324
  this.color = '';
1051
- /**
1052
- * Applies the dark theme variant to the component
1053
- */
1054
- this.dark = false;
1055
1325
  /**
1056
1326
  * Removes the ability to click or target the component
1057
1327
  */
@@ -1068,10 +1338,6 @@ class Card extends ComponentRender {
1068
1338
  * Specifies an image background for the card
1069
1339
  */
1070
1340
  this.img = '';
1071
- /**
1072
- * Applies the light theme variant to the component
1073
- */
1074
- this.light = false;
1075
1341
  /**
1076
1342
  * Designates that the card is a link
1077
1343
  */
@@ -1095,7 +1361,6 @@ class Card extends ComponentRender {
1095
1361
  this.activeClass = this.getInitValue('activeClass', props.activeClass, this.activeClass);
1096
1362
  this.append = this.getInitValue('append', props.append, this.append);
1097
1363
  this.color = this.getInitValue('color', props.color, this.color);
1098
- this.dark = this.getInitValue('dark', props.dark, this.dark);
1099
1364
  this.disabled = this.getInitValue('disabled', props.disabled, this.disabled);
1100
1365
  this.elevation = this.getInitValue('elevation', props.elevation, this.elevation);
1101
1366
  this.flat = this.getInitValue('flat', props.flat, this.flat);
@@ -1103,7 +1368,6 @@ class Card extends ComponentRender {
1103
1368
  this.hover = this.getInitValue('hover', props.hover, this.hover);
1104
1369
  this.href = this.getInitValue('href', props.href, this.href);
1105
1370
  this.img = this.getInitValue('img', props.img, this.img);
1106
- this.light = this.getInitValue('light', props.light, this.light);
1107
1371
  this.link = this.getInitValue('link', props.link, this.link);
1108
1372
  this.maxHeight = this.getInitValue('maxHeight', props.maxHeight, this.maxHeight);
1109
1373
  this.maxWidth = this.getInitValue('maxWidth', props.maxWidth, this.maxWidth);
@@ -1174,6 +1438,7 @@ class Form extends ComponentRender {
1174
1438
  this.internalValue = {};
1175
1439
  this.align = this.getInitValue('align', props.align, this.align);
1176
1440
  this.justify = this.getInitValue('justify', props.justify, this.justify);
1441
+ this.height = this.getInitValue('height', props.height, this.height);
1177
1442
  this.internalValue = this.getInitValue('value', props.value, this.value);
1178
1443
  this.createAccessors();
1179
1444
  }
@@ -1316,10 +1581,6 @@ class Input extends ComponentRender {
1316
1581
  * It can be the name of material or css color in hexa.
1317
1582
  */
1318
1583
  this.color = 'primary';
1319
- /**
1320
- * Applies the dark theme variant to the input.
1321
- */
1322
- this.dark = false;
1323
1584
  /**
1324
1585
  * Defines smaller input.
1325
1586
  */
@@ -1336,10 +1597,6 @@ class Input extends ComponentRender {
1336
1597
  * Defines the input label.
1337
1598
  */
1338
1599
  this.label = '';
1339
- /**
1340
- * Applies the light theme variant to the input.
1341
- */
1342
- this.light = false;
1343
1600
  /**
1344
1601
  * Applies a custom character mask to the input.
1345
1602
  */
@@ -1408,13 +1665,11 @@ class Input extends ComponentRender {
1408
1665
  this.autofocus = this.getInitValue('autofocus', props.autofocus, this.autofocus);
1409
1666
  this.clearable = this.getInitValue('clearable', props.clearable, this.clearable);
1410
1667
  this.color = this.getInitValue('color', props.color, this.color);
1411
- this.dark = this.getInitValue('dark', props.dark, this.dark);
1412
1668
  this.dense = this.getInitValue('dense', props.dense, this.dense);
1413
1669
  this.disabled = this.getInitValue('disabled', props.disabled, this.disabled);
1414
1670
  this.hint = this.getInitValue('hint', props.hint, this.hint);
1415
1671
  this.autoHintDetails = this.getInitValue('autoHintDetails', props.autoHintDetails, this.autoHintDetails);
1416
1672
  this.label = this.getInitValue('label', props.label, this.label);
1417
- this.light = this.getInitValue('light', props.light, this.light);
1418
1673
  this.mask = this.getInitValue('mask', props.mask, this.mask);
1419
1674
  this.maxLength = this.getInitValue('maxLength', props.maxLength, this.maxLength);
1420
1675
  this.persistentHint = this.getInitValue('persistentHint', props.persistentHint, this.persistentHint);
@@ -1773,6 +2028,10 @@ class CodeEditor extends ComponentRender {
1773
2028
  * Max height in pixels. 'none' means no limit.
1774
2029
  */
1775
2030
  this.maxHeight = 'none';
2031
+ /**
2032
+ * Max height in pixels. 'none' means no limit.
2033
+ */
2034
+ this.height = 'auto';
1776
2035
  /**
1777
2036
  * Language code to be used for highlight (js|javascript, css, html, json, ts|typescript, bash|shell)
1778
2037
  * Other languages must be imported above
@@ -1792,6 +2051,7 @@ class CodeEditor extends ComponentRender {
1792
2051
  this.staticCode = this.getInitValue('staticCode', props.staticCode, this.staticCodeValue);
1793
2052
  this.copyIcon = this.getInitValue('copyIcon', props.copyIcon, this.copyIcon);
1794
2053
  this.maxHeight = this.getInitValue('maxHeight', props.maxHeight, this.maxHeight);
2054
+ this.height = this.getInitValue('height', props.height, this.height);
1795
2055
  this.language = this.getInitValue('language', props.language, this.language);
1796
2056
  this.showLineNumbers = this.getInitValue('showLineNumbers', props.showLineNumbers, this.showLineNumbers);
1797
2057
  this.createAccessors();
@@ -1998,12 +2258,27 @@ class Container extends ComponentRender {
1998
2258
  * Adds height 100% to container.
1999
2259
  */
2000
2260
  this.fillHeight = false;
2261
+ /**
2262
+ * Sets the height for the component.
2263
+ */
2264
+ this.height = 'auto';
2265
+ /**
2266
+ * Sets the maximum height for the component.
2267
+ */
2268
+ this.maxHeight = 'none';
2269
+ /**
2270
+ * Sets the minimum height for the component.
2271
+ */
2272
+ this.minHeight = 'none';
2001
2273
  /**
2002
2274
  * Removes viewport maximum-width size breakpoints.
2003
2275
  */
2004
2276
  this.fluid = true;
2005
2277
  this.fluid = this.getInitValue('fluid', props.fluid, this.fluid);
2006
2278
  this.fillHeight = this.getInitValue('fillHeight', props.fillHeight, this.fillHeight);
2279
+ this.height = this.getInitValue('height', props.height, this.height);
2280
+ this.maxHeight = this.getInitValue('maxHeight', props.maxHeight, this.maxHeight);
2281
+ this.minHeight = this.getInitValue('minHeight', props.minHeight, this.minHeight);
2007
2282
  this.createAccessors();
2008
2283
  }
2009
2284
  }
@@ -2341,6 +2616,14 @@ class Dialog extends Component {
2341
2616
  * Dialog type (normal, success, error, warning, info)
2342
2617
  */
2343
2618
  this.type = 'normal';
2619
+ /**
2620
+ * Confirm button component name
2621
+ */
2622
+ this.confirmButton = 'dialogButton';
2623
+ /**
2624
+ * Deny button component name
2625
+ */
2626
+ this.denyButton = undefined;
2344
2627
  /**
2345
2628
  * Default dialog buttons
2346
2629
  * @private
@@ -2352,6 +2635,8 @@ class Dialog extends Component {
2352
2635
  events: { click: () => this.hide() },
2353
2636
  }];
2354
2637
  this.defaultValues = {
2638
+ confirmButton: this.confirmButton,
2639
+ denyButton: this.denyButton,
2355
2640
  name: this.name,
2356
2641
  maxWidth: this.maxWidth,
2357
2642
  persistent: this.persistent,
@@ -2359,6 +2644,38 @@ class Dialog extends Component {
2359
2644
  title: this.title,
2360
2645
  text: this.text,
2361
2646
  };
2647
+ this.clickDefaultButtonKeyMapping = {
2648
+ enter: {
2649
+ event: () => {
2650
+ if (this.confirmButton) {
2651
+ const confirmButton = Metadata.getInstance(this.confirmButton);
2652
+ if (confirmButton
2653
+ && confirmButton.events
2654
+ && confirmButton.events.click
2655
+ && typeof confirmButton.events.click === 'function') {
2656
+ confirmButton.events.click({ component: new Button(confirmButton) });
2657
+ }
2658
+ }
2659
+ },
2660
+ stop: true,
2661
+ },
2662
+ esc: {
2663
+ event: () => {
2664
+ if (this.denyButton) {
2665
+ const denyButton = Metadata.getInstance(this.denyButton);
2666
+ if (denyButton
2667
+ && denyButton.events
2668
+ && denyButton.events.click
2669
+ && typeof denyButton.events.click === 'function')
2670
+ denyButton.events.click({ component: new Button(denyButton) });
2671
+ }
2672
+ else {
2673
+ this.hide();
2674
+ }
2675
+ },
2676
+ stop: true,
2677
+ },
2678
+ };
2362
2679
  this.assignDialogProperties(props);
2363
2680
  this.createAccessors();
2364
2681
  }
@@ -2368,6 +2685,8 @@ class Dialog extends Component {
2368
2685
  */
2369
2686
  assignDialogProperties(dialog) {
2370
2687
  this.buttons = dialog.buttons && dialog.buttons.length ? dialog.buttons : this.defaultButtons;
2688
+ this.confirmButton = this.getInitValue('confirmButton', dialog.confirmButton, this.defaultValues.confirmButton);
2689
+ this.denyButton = this.getInitValue('denyButton', dialog.denyButton, this.defaultValues.denyButton);
2371
2690
  this.name = this.getInitValue('name', dialog.name, this.defaultValues.name);
2372
2691
  this.maxWidth = this.getInitValue('maxWidth', dialog.maxWidth, this.defaultValues.maxWidth);
2373
2692
  this.persistent = this.getInitValue('persistent', dialog.persistent, this.defaultValues.persistent);
@@ -2380,6 +2699,7 @@ class Dialog extends Component {
2380
2699
  * Displays dialog
2381
2700
  */
2382
2701
  show() {
2702
+ KeyMap.bind(this.clickDefaultButtonKeyMapping, this);
2383
2703
  this.isVisible = true;
2384
2704
  }
2385
2705
  /**
@@ -2387,6 +2707,7 @@ class Dialog extends Component {
2387
2707
  */
2388
2708
  hide() {
2389
2709
  this.isVisible = false;
2710
+ KeyMap.unbind(this.clickDefaultButtonKeyMapping, this);
2390
2711
  }
2391
2712
  }
2392
2713
 
@@ -3322,10 +3643,6 @@ class DateRange extends TextInput {
3322
3643
  * Sets the locale. Accepts a string with a BCP 47 language tag.
3323
3644
  */
3324
3645
  this.locale = I18n.instance.language;
3325
- /**
3326
- * Defines if dates should be ordered
3327
- */
3328
- this.orderedDates = false;
3329
3646
  /**
3330
3647
  * Allows changing displayed month with mouse scroll
3331
3648
  */
@@ -3349,15 +3666,12 @@ class DateRange extends TextInput {
3349
3666
  this.appendIcon = this.getInitValue('appendIcon', props.appendIcon, 'calendar');
3350
3667
  this.autocomplete = this.getInitValue('autocomplete', props.autocomplete, this.autocomplete);
3351
3668
  this.dateFormat = this.getInitValue('dateFormat', props.dateFormat, this.dateFormat);
3352
- this.orderedDates = this.getInitValue('orderedDates', props.orderedDates, this.orderedDates);
3353
3669
  this.dateValidation = this.dateValidation.bind(this);
3354
- this.dateValidateOrder = this.dateValidateOrder.bind(this);
3355
3670
  this.displayFormat = this.getInitValue('displayFormat', props.displayFormat, this.displayFormat);
3356
3671
  this.inputFormat = this.getInitValue('inputFormat', props.inputFormat, this.inputFormat);
3357
3672
  this.firstDayOfWeek = this.getInitValue('firstDayOfWeek', props.firstDayOfWeek, this.firstDayOfWeek);
3358
3673
  this.fullWidth = this.getInitValue('fullWidth', props.fullWidth, this.fullWidth);
3359
3674
  this.locale = this.getInitValue('locale', props.locale, this.locale);
3360
- this.rules.push(this.dateValidation, this.dateValidateOrder);
3361
3675
  this.scrollable = this.getInitValue('scrollable', props.scrollable, this.scrollable);
3362
3676
  this.showDatePicker = this.getInitValue('showDatePicker', props.showDatePicker, this.showDatePicker);
3363
3677
  this.showWeek = this.getInitValue('showWeek', props.showWeek, this.showWeek);
@@ -3465,7 +3779,7 @@ class DateRange extends TextInput {
3465
3779
  const lastValue = this.value;
3466
3780
  this.dateError = false;
3467
3781
  this.value = this.parseISODateRangeValue(newValue);
3468
- if (!isEqual(lastValue, this.value))
3782
+ if (!Utils.isEqual(lastValue, this.value))
3469
3783
  this.change(this.value);
3470
3784
  }
3471
3785
  formatISODateRangeValue(dates) {
@@ -3474,13 +3788,13 @@ class DateRange extends TextInput {
3474
3788
  splitedValue = dates;
3475
3789
  else
3476
3790
  splitedValue = this.splitValues(dates);
3477
- const formatedValue = [];
3791
+ const formattedValue = [];
3478
3792
  splitedValue.forEach((value) => {
3479
3793
  if (value && this.isValidDate(value, this.dateFormat)) {
3480
- formatedValue.push(dayjs(value, this.dateFormat, true).format(this.isoFormat));
3794
+ formattedValue.push(dayjs(value, this.dateFormat, true).format(this.isoFormat));
3481
3795
  }
3482
3796
  });
3483
- return formatedValue;
3797
+ return formattedValue;
3484
3798
  }
3485
3799
  parseISODateRangeValue(values) {
3486
3800
  const parsedValue = [];
@@ -3491,19 +3805,14 @@ class DateRange extends TextInput {
3491
3805
  }
3492
3806
  });
3493
3807
  }
3494
- return parsedValue;
3808
+ return this.sortDates(parsedValue);
3809
+ }
3810
+ sortDates(parsedValue) {
3811
+ return parsedValue.sort((a, b) => (dayjs(a, this.dateFormat).isAfter(dayjs(b, this.dateFormat)) ? 1 : -1));
3495
3812
  }
3496
3813
  dateValidation() {
3497
3814
  return !this.dateError || I18n.translate('VALIDATION_INVALID_DATE');
3498
3815
  }
3499
- dateValidateOrder() {
3500
- if (this.value && (this.value.length === 2 && this.orderedDates)) {
3501
- const date1 = dayjs(this.value[0], this.dateFormat);
3502
- const date2 = dayjs(this.value[1], this.dateFormat);
3503
- return (date1.isBefore(date2) || date1.isSame(date2)) || I18n.translate('VALIDATION_INVALID_ORDER_DATE');
3504
- }
3505
- return true;
3506
- }
3507
3816
  click(event, element) {
3508
3817
  super.click(event, element);
3509
3818
  if (!event.defaultPrevented) {
@@ -3511,6 +3820,7 @@ class DateRange extends TextInput {
3511
3820
  }
3512
3821
  }
3513
3822
  blur(event, element) {
3823
+ this.value = this.sortDates(this.value);
3514
3824
  this.removeDateMask();
3515
3825
  this.setDateValue(this.displayValue);
3516
3826
  super.blur(event, element);
@@ -3672,18 +3982,10 @@ class Divider extends ComponentRender {
3672
3982
  */
3673
3983
  constructor(props) {
3674
3984
  super(props);
3675
- /**
3676
- * Applies the dark theme variant to the component.
3677
- */
3678
- this.dark = false;
3679
3985
  /**
3680
3986
  * Adds indentation (72px) for normal dividers, reduces max height for vertical.
3681
3987
  */
3682
3988
  this.inset = false;
3683
- /**
3684
- * Applies the light theme variant to the component.
3685
- */
3686
- this.light = false;
3687
3989
  /**
3688
3990
  * Displays dividers vertically.
3689
3991
  */
@@ -3735,6 +4037,10 @@ class Dropdown extends ComponentRender {
3735
4037
  * Applies position fixed to the dropdown.
3736
4038
  */
3737
4039
  this.fixed = false;
4040
+ /**
4041
+ * Sets the height for the dropdown.
4042
+ */
4043
+ this.height = 'auto';
3738
4044
  /**
3739
4045
  * Offset the menu on the x-axis.
3740
4046
  */
@@ -3760,6 +4066,7 @@ class Dropdown extends ComponentRender {
3760
4066
  this.disabled = this.getInitValue('disabled', props.disabled, this.disabled);
3761
4067
  this.fixed = this.getInitValue('fixed', props.fixed, this.fixed);
3762
4068
  this.hover = this.getInitValue('hover', props.hover, this.hover);
4069
+ this.height = this.getInitValue('height', props.height, this.height);
3763
4070
  this.maxHeight = this.getInitValue('maxHeight', props.maxHeight, this.maxHeight);
3764
4071
  this.minHeight = this.getInitValue('minHeight', props.minHeight, this.minHeight);
3765
4072
  this.maxWidth = this.getInitValue('maxWidth', props.maxWidth, this.maxWidth);
@@ -3953,10 +4260,6 @@ class Footer extends ComponentRender {
3953
4260
  * Applies specified color to the control. It can be the name of material or css color in hexa.
3954
4261
  */
3955
4262
  this.color = 'primary';
3956
- /**
3957
- * Applies the dark theme variant to footer.
3958
- */
3959
- this.dark = false;
3960
4263
  /**
3961
4264
  * Applies position fixed to footer.
3962
4265
  */
@@ -3973,10 +4276,6 @@ class Footer extends ComponentRender {
3973
4276
  * Render components on the left of footer.
3974
4277
  */
3975
4278
  this.leftSlot = [];
3976
- /**
3977
- * Applies the light theme variant to the footer.
3978
- */
3979
- this.light = false;
3980
4279
  /**
3981
4280
  * Remove all padding from the footer.
3982
4281
  */
@@ -4029,12 +4328,18 @@ class Frame extends ComponentRender {
4029
4328
  this.override = {};
4030
4329
  this.cache = false;
4031
4330
  this.cacheDuration = 2 * 60 * 60 * 1000;
4331
+ this.height = 'auto';
4332
+ this.maxHeight = 'none';
4333
+ this.minHeight = 'none';
4032
4334
  this.headerName = 'sw-fetched-on';
4033
4335
  this.path = props.path;
4034
4336
  this.local = props.local === true;
4035
4337
  this.override = props.override || this.override;
4036
4338
  this.cache = props.cache || this.cache;
4037
4339
  this.cacheDuration = this.getInitValue('cacheDuration', props.cacheDuration, this.cacheDuration);
4340
+ this.height = this.getInitValue('height', props.height, this.height);
4341
+ this.minHeight = this.getInitValue('minHeight', props.minHeight, this.minHeight);
4342
+ this.maxHeight = this.getInitValue('maxHeight', props.maxHeight, this.maxHeight);
4038
4343
  this.createAccessors();
4039
4344
  this.getMetadata();
4040
4345
  }
@@ -4055,6 +4360,12 @@ class Frame extends ComponentRender {
4055
4360
  }
4056
4361
  });
4057
4362
  }
4363
+ reload() {
4364
+ return __awaiter(this, void 0, void 0, function* () {
4365
+ this.loading = true;
4366
+ this.getMetadata();
4367
+ });
4368
+ }
4058
4369
  notFoundError() { }
4059
4370
  requestPage() {
4060
4371
  return __awaiter(this, void 0, void 0, function* () {
@@ -4545,7 +4856,7 @@ class GridColumn extends Column {
4545
4856
  if (this.componentProps.dataValueOut && ((_a = component.datasource) === null || _a === void 0 ? void 0 : _a.currentRow)) {
4546
4857
  this.componentProps.dataValueOut.forEach((columns) => {
4547
4858
  const { column, columnOnGrid } = columns;
4548
- if (!isEqual(newRow.originalRow[columnOnGrid], component.datasource.currentRow[column])) {
4859
+ if (!Utils.isEqual(newRow.originalRow[columnOnGrid], component.datasource.currentRow[column])) {
4549
4860
  newRow[`${columnOnGrid}_original`] = newRow.originalRow[columnOnGrid];
4550
4861
  newRow[columnOnGrid] = component.datasource.currentRow[column];
4551
4862
  }
@@ -4709,7 +5020,11 @@ class Grid extends Iterable {
4709
5020
  /**
4710
5021
  * Color of the header background
4711
5022
  */
4712
- this.headerBackground = 'white';
5023
+ this.headerBackground = '';
5024
+ /**
5025
+ * Color of the header cell text color
5026
+ */
5027
+ this.headerCellTextColor = '';
4713
5028
  /**
4714
5029
  * Available order types
4715
5030
  * @public
@@ -4753,6 +5068,8 @@ class Grid extends Iterable {
4753
5068
  },
4754
5069
  };
4755
5070
  this.dense = this.getInitValue('dense', props.dense, this.dense);
5071
+ this.dark = this.getInitValue('dark', props.dark, this.dark);
5072
+ this.light = this.getInitValue('light', props.light, this.light);
4756
5073
  this.selectable = this.getInitValue('selectable', props.selectable, this.selectable);
4757
5074
  this.height = this.getInitValue('height', props.height, this.height);
4758
5075
  this.fillHeight = this.getInitValue('fillHeight', props.fillHeight, this.fillHeight);
@@ -4762,6 +5079,7 @@ class Grid extends Iterable {
4762
5079
  this.showFooter = this.getInitValue('showFooter', props.showFooter, this.showFooter);
4763
5080
  this.showHeader = this.getInitValue('showHeader', props.showHeader, this.showHeader);
4764
5081
  this.headerBackground = this.getInitValue('headerBackground', props.headerBackground, this.headerBackground);
5082
+ this.headerCellTextColor = this.getInitValue('headerCellTextColor', props.headerCellTextColor, this.headerCellTextColor);
4765
5083
  this.dragColumns = this.getInitValue('dragColumns', props.dragColumns, this.dragColumns);
4766
5084
  this.resizeColumns = this.getInitValue('resizeColumns', props.resizeColumns, this.resizeColumns);
4767
5085
  this.toolbarSlot = props.toolbarSlot || this.toolbarSlot;
@@ -4930,6 +5248,7 @@ class Grid extends Iterable {
4930
5248
  var _a, _b, _c;
4931
5249
  const rowKey = row[this.datasource.uniqueKey];
4932
5250
  const compName = actionComponent.name;
5251
+ const instanceName = `${compName}_${rowKey}`;
4933
5252
  const path = parentPath ? `${parentPath}.${compName}` : compName;
4934
5253
  const newComponent = merge({}, actionComponent, (_b = (_a = this.actionsApplied[rowKey]) === null || _a === void 0 ? void 0 : _a[column.name]) === null || _b === void 0 ? void 0 : _b[path]);
4935
5254
  let compEvents = {};
@@ -4944,7 +5263,16 @@ class Grid extends Iterable {
4944
5263
  }
4945
5264
  } });
4946
5265
  const newChildren = (_c = newComponent.children) === null || _c === void 0 ? void 0 : _c.map((child) => this.getActionComponent(child, column, row, path));
4947
- return Object.assign(Object.assign({}, newComponent), { events: newEvents, name: `${compName}_${rowKey}`, children: newChildren });
5266
+ newComponent.name = instanceName;
5267
+ newComponent.children = newChildren;
5268
+ newComponent.events = newEvents;
5269
+ try {
5270
+ Metadata.updateInstance(instanceName, newComponent);
5271
+ }
5272
+ catch (e) {
5273
+ // do nothing
5274
+ }
5275
+ return newComponent;
4948
5276
  }
4949
5277
  changeDefaultSlotNames(slot) {
4950
5278
  slot.forEach((item) => {
@@ -5009,15 +5337,36 @@ class GridEditable extends Grid {
5009
5337
  * @private
5010
5338
  */
5011
5339
  this.editedRows = {};
5340
+ /**
5341
+ * Rows with newRowIdentifier
5342
+ * @private
5343
+ */
5344
+ this.addedRows = {};
5012
5345
  /**
5013
5346
  * Invalid inline components
5014
5347
  * @private
5015
5348
  */
5016
5349
  this.invalidComponents = {};
5017
- this.newRowIdentifier = '__added_row';
5018
- this.doubleClickEdit = this.getInitValue('doubleClickEdit', props.doubleClickEdit, this.doubleClickEdit);
5350
+ this.cancelEditedRowsKeyMapping = {
5351
+ esc: {
5352
+ event: this.cancelEditedRows.bind(this),
5353
+ stop: true,
5354
+ input: true,
5355
+ active: true,
5356
+ },
5357
+ };
5358
+ this.newRowIdentifier = '__added_row';
5359
+ this.doubleClickEdit = this.getInitValue('doubleClickEdit', props.doubleClickEdit, this.doubleClickEdit);
5019
5360
  this.createAccessors();
5020
5361
  }
5362
+ onMounted(element) {
5363
+ super.onMounted(element);
5364
+ KeyMap.bind(this.cancelEditedRowsKeyMapping, this, element);
5365
+ }
5366
+ onBeforeDestroy() {
5367
+ super.onBeforeDestroy();
5368
+ KeyMap.unbind(this.cancelEditedRowsKeyMapping, this);
5369
+ }
5021
5370
  /**
5022
5371
  * Get Grid columns objects
5023
5372
  * @param columns Grid columns parameter
@@ -5187,7 +5536,7 @@ class GridEditable extends Grid {
5187
5536
  changeEditableComponent(column, row, value, component) {
5188
5537
  const key = row[this.datasource.uniqueKey];
5189
5538
  const columnName = column.name;
5190
- if (!isEqual(value, row[columnName])) {
5539
+ if (!Utils.isEqual(value, row[columnName])) {
5191
5540
  const newRow = {};
5192
5541
  newRow[key] = Object.assign({}, this.editedRows[key]);
5193
5542
  newRow[key].originalRow = Object.assign({}, row);
@@ -5233,6 +5582,14 @@ class GridEditable extends Grid {
5233
5582
  * Cancels all edited rows and enable grid components
5234
5583
  */
5235
5584
  cancelEditedRows() {
5585
+ return __awaiter(this, void 0, void 0, function* () {
5586
+ yield this.removeAddedRows();
5587
+ this.editing = false;
5588
+ this.editedRows = {};
5589
+ this.invalidComponents = {};
5590
+ });
5591
+ }
5592
+ removeAddedRows() {
5236
5593
  return __awaiter(this, void 0, void 0, function* () {
5237
5594
  const { data } = this.datasource;
5238
5595
  data.forEach((row, index) => {
@@ -5241,21 +5598,26 @@ class GridEditable extends Grid {
5241
5598
  }
5242
5599
  });
5243
5600
  yield this.datasource.updateData(data);
5244
- this.editing = false;
5245
- this.editedRows = {};
5246
- this.invalidComponents = {};
5247
5601
  });
5248
5602
  }
5603
+ addDataRow(row) {
5604
+ if (this.addedRows[row[this.datasource.uniqueKey]])
5605
+ this.datasource.post(row);
5606
+ else
5607
+ this.datasource.put(row);
5608
+ }
5249
5609
  /**
5250
5610
  * Saves all edited rows if they are valid
5251
5611
  * @throws Will throw when it finds an invalid row
5252
5612
  */
5253
5613
  saveEditedRows() {
5254
5614
  return __awaiter(this, void 0, void 0, function* () {
5255
- const response = yield Promise.all(this.getEditedRows().map((row) => this.datasource.put(row)));
5615
+ yield this.removeAddedRows();
5616
+ const response = yield Promise.all(this.getEditedRows().map((row) => this.addDataRow(row)));
5256
5617
  this.editing = false;
5257
5618
  this.editedRows = {};
5258
5619
  this.invalidComponents = {};
5620
+ this.addedRows = {};
5259
5621
  yield this.datasource.get();
5260
5622
  return response;
5261
5623
  });
@@ -5267,8 +5629,11 @@ class GridEditable extends Grid {
5267
5629
  getEditedRows() {
5268
5630
  const editedRows = [];
5269
5631
  Object.keys(this.editedRows).forEach((key) => {
5632
+ this.addedRows = {};
5270
5633
  const row = Object.assign(Object.assign({}, this.editedRows[key].originalRow), this.editedRows[key]);
5271
5634
  delete row.originalRow;
5635
+ if (row[this.newRowIdentifier])
5636
+ this.addedRows[key] = row;
5272
5637
  delete row[this.newRowIdentifier];
5273
5638
  Object.keys(row).forEach((attr) => {
5274
5639
  if (Object.prototype.hasOwnProperty.call(row, `${attr}_original`)) {
@@ -5420,10 +5785,6 @@ class Header extends ComponentRender {
5420
5785
  * Applies specified color to the control. It can be the name of material or css color in hexa.
5421
5786
  */
5422
5787
  this.color = 'primary';
5423
- /**
5424
- * Applies the dark theme variant to header.
5425
- */
5426
- this.dark = false;
5427
5788
  /**
5428
5789
  * Designates that the application menu positioned on the left is below the header.
5429
5790
  */
@@ -5448,10 +5809,6 @@ class Header extends ComponentRender {
5448
5809
  * Render components on the left of header.
5449
5810
  */
5450
5811
  this.leftSlot = [];
5451
- /**
5452
- * Applies the light theme variant to the header.
5453
- */
5454
- this.light = false;
5455
5812
  /**
5456
5813
  * Removes internal padding from header.
5457
5814
  */
@@ -5466,13 +5823,11 @@ class Header extends ComponentRender {
5466
5823
  this.clippedLeft = this.getInitValue('clippedLeft', props.clippedLeft, this.clippedLeft);
5467
5824
  this.clippedRight = this.getInitValue('clippedRight', props.clippedRight, this.clippedRight);
5468
5825
  this.color = this.getInitValue('color', props.color, this.color);
5469
- this.dark = this.getInitValue('dark', props.dark, this.dark);
5470
5826
  this.dense = this.getInitValue('dense', props.dense, this.dense);
5471
5827
  this.elevation = this.getInitValue('elevation', props.elevation, this.elevation);
5472
5828
  this.fixed = this.getInitValue('fixed', props.fixed, this.fixed);
5473
5829
  this.height = this.getInitValue('height', props.height, this.height);
5474
5830
  this.leftSlot = props.leftSlot || this.leftSlot;
5475
- this.light = this.getInitValue('light', props.light, this.light);
5476
5831
  this.maxHeight = this.getInitValue('maxHeight', props.maxHeight, this.maxHeight);
5477
5832
  this.maxWidth = this.getInitValue('maxWidth', props.maxWidth, this.maxWidth);
5478
5833
  this.minHeight = this.getInitValue('minHeight', props.minHeight, this.minHeight);
@@ -5506,10 +5861,6 @@ class Icon extends ComponentRender {
5506
5861
  * (for example success or purple) or css color (#033 or rgba(255, 0, 0, 0.5)).
5507
5862
  */
5508
5863
  this.color = '';
5509
- /**
5510
- * Applies the dark theme variant to the component.
5511
- */
5512
- this.dark = false;
5513
5864
  /**
5514
5865
  * Makes icon smaller (20px)
5515
5866
  */
@@ -5531,10 +5882,6 @@ class Icon extends ComponentRender {
5531
5882
  * of a button when placed to the left of another element or text
5532
5883
  */
5533
5884
  this.left = false;
5534
- /**
5535
- * Applies the light theme variant to the component.
5536
- */
5537
- this.light = false;
5538
5885
  /**
5539
5886
  * Applies appropriate margins to the icon inside of
5540
5887
  * a button when placed to the right of another element or text
@@ -5553,13 +5900,11 @@ class Icon extends ComponentRender {
5553
5900
  */
5554
5901
  this.tag = 'i';
5555
5902
  this.color = this.getInitValue('color', props.color, this.color);
5556
- this.dark = this.getInitValue('dark', props.dark, this.dark);
5557
5903
  this.dense = this.getInitValue('dense', props.dense, this.dense);
5558
5904
  this.disabled = this.getInitValue('disabled', props.disabled, this.disabled);
5559
5905
  this.iconName = this.getInitValue('iconName', props.iconName, this.iconName);
5560
5906
  this.large = this.getInitValue('large', props.large, this.large);
5561
5907
  this.left = this.getInitValue('left', props.left, this.left);
5562
- this.light = this.getInitValue('light', props.light, this.light);
5563
5908
  this.right = this.getInitValue('right', props.right, this.right);
5564
5909
  this.size = this.getInitValue('size', props.size, this.size);
5565
5910
  this.small = this.getInitValue('small', props.small, this.small);
@@ -5982,11 +6327,12 @@ class Select extends TextInput {
5982
6327
  overrideGet() {
5983
6328
  const oldGet = this.datasource.get;
5984
6329
  this.datasource.get = () => __awaiter(this, void 0, void 0, function* () {
5985
- yield oldGet.call(this.datasource);
5986
- if (this.indexOf(this.value) !== -1 || this.datasource.search || this.isFocused)
5987
- return;
5988
- yield this.setValue(this.value, false);
5989
- this.removePushedValue();
6330
+ const response = yield oldGet.call(this.datasource);
6331
+ if (this.indexOf(this.value) === -1 && !this.datasource.search && !this.isFocused) {
6332
+ yield this.setValue(this.value, false);
6333
+ this.removePushedValue();
6334
+ }
6335
+ return response;
5990
6336
  });
5991
6337
  }
5992
6338
  get search() {
@@ -6543,10 +6889,6 @@ class ItemNotFoundError extends Error {
6543
6889
  class List extends ComponentRender {
6544
6890
  constructor(props) {
6545
6891
  super(props);
6546
- /**
6547
- * Applies the dark theme variant to the List.
6548
- */
6549
- this.dark = false;
6550
6892
  /**
6551
6893
  * Create the list with smaller items.
6552
6894
  */
@@ -6559,10 +6901,6 @@ class List extends ComponentRender {
6559
6901
  * Render list with dividers between the items.
6560
6902
  */
6561
6903
  this.divided = false;
6562
- /**
6563
- * Applies the light theme variant to the List.
6564
- */
6565
- this.light = false;
6566
6904
  /**
6567
6905
  * Increases the height of all the list items to better support three lines of text.
6568
6906
  */
@@ -6579,6 +6917,18 @@ class List extends ComponentRender {
6579
6917
  * Will only collapse when explicitly closed.
6580
6918
  */
6581
6919
  this.expand = false;
6920
+ /**
6921
+ * Sets the height for the component.
6922
+ */
6923
+ this.height = 'auto';
6924
+ /**
6925
+ * Sets the maxHeight for the component.
6926
+ */
6927
+ this.maxHeight = 'none';
6928
+ /**
6929
+ * Sets the minHeight for the component.
6930
+ */
6931
+ this.minHeight = 'none';
6582
6932
  this.dark = this.getInitValue('dark', props.dark, this.dark);
6583
6933
  this.dense = this.getInitValue('dense', props.dense, this.dense);
6584
6934
  this.disabled = this.getInitValue('disabled', props.disabled, this.disabled);
@@ -6590,6 +6940,9 @@ class List extends ComponentRender {
6590
6940
  this.color = this.getInitValue('color', props.color, this.color);
6591
6941
  this.elevation = this.getInitValue('elevation', props.elevation, this.elevation);
6592
6942
  this.expand = this.getInitValue('expand', props.expand, this.expand);
6943
+ this.height = this.getInitValue('height', props.height, this.height);
6944
+ this.maxHeight = this.getInitValue('maxHeight', props.maxHeight, this.maxHeight);
6945
+ this.minHeight = this.getInitValue('minHeight', props.minHeight, this.minHeight);
6593
6946
  this.createAccessors();
6594
6947
  }
6595
6948
  /**
@@ -6707,10 +7060,6 @@ class Login extends ComponentRender {
6707
7060
  * It can be the name of material or css color in hexa.
6708
7061
  */
6709
7062
  this.color = '';
6710
- /**
6711
- * Applies the dark theme.
6712
- */
6713
- this.dark = false;
6714
7063
  /**
6715
7064
  * Card position orientation.
6716
7065
  */
@@ -6739,7 +7088,6 @@ class Login extends ComponentRender {
6739
7088
  this.bottomLink = props.bottomLink || this.bottomLink;
6740
7089
  this.cardWidth = this.getInitValue('cardWidth', props.cardWidth, this.cardWidth);
6741
7090
  this.color = this.getInitValue('color', props.color, this.color);
6742
- this.dark = this.getInitValue('dark', props.dark, this.dark);
6743
7091
  this.layout = this.getInitValue('layout', props.layout, this.layout);
6744
7092
  this.logo = this.getInitValue('logo', props.logo, this.logo);
6745
7093
  this.logoMessage = this.getInitValue('logoMessage', props.logoMessage, this.logoMessage);
@@ -6966,10 +7314,6 @@ class Menu extends ComponentRender {
6966
7314
  * Defines if the menu should have a visible container
6967
7315
  */
6968
7316
  this.floating = false;
6969
- /**
6970
- * Applies the dark theme variant to the menu.
6971
- */
6972
- this.dark = false;
6973
7317
  /**
6974
7318
  * Create the menu with smaller items.
6975
7319
  */
@@ -7052,7 +7396,6 @@ class Menu extends ComponentRender {
7052
7396
  this.clipped = this.getInitValue('clipped', props.clipped, this.clipped);
7053
7397
  this.fixed = this.getInitValue('fixed', props.fixed, this.fixed);
7054
7398
  this.floating = this.getInitValue('floating', props.floating, this.floating);
7055
- this.dark = this.getInitValue('dark', props.dark, this.dark);
7056
7399
  this.dense = this.getInitValue('dense', props.dense, this.dense);
7057
7400
  this.mini = this.getInitValue('mini', props.mini, this.mini);
7058
7401
  this.miniState = this.getInitValue('miniState', props.miniState, this.miniState);
@@ -7281,7 +7624,7 @@ class Menu extends ComponentRender {
7281
7624
  if (item.component === 'ZdMenuGroup') {
7282
7625
  this.searchItems(item.items);
7283
7626
  }
7284
- else if (normalize(I18n.translate(item.label)).indexOf(normalize(this.searchValue)) !== -1) {
7627
+ else if (Utils.normalize(I18n.translate(item.label)).indexOf(Utils.normalize(this.searchValue)) !== -1) {
7285
7628
  this.filteredMenuItems.push(item);
7286
7629
  }
7287
7630
  }
@@ -7693,10 +8036,6 @@ class Progress extends ComponentRender {
7693
8036
  * Defines the value color
7694
8037
  */
7695
8038
  this.color = 'primary';
7696
- /**
7697
- * Applies the dark theme variant to the component
7698
- */
7699
- this.dark = false;
7700
8039
  /**
7701
8040
  * Sets the height for the component
7702
8041
  */
@@ -7705,10 +8044,6 @@ class Progress extends ComponentRender {
7705
8044
  * Animates the component constantly
7706
8045
  */
7707
8046
  this.indeterminate = false;
7708
- /**
7709
- * Applies the light theme variant to the component
7710
- */
7711
- this.light = false;
7712
8047
  /**
7713
8048
  * Render components on the progress component
7714
8049
  */
@@ -7720,10 +8055,8 @@ class Progress extends ComponentRender {
7720
8055
  this.backgroundColor = this.getInitValue('backgroundColor', props.backgroundColor, this.backgroundColor);
7721
8056
  this.backgroundOpacity = this.getInitValue('backgroundOpacity', props.backgroundOpacity, this.backgroundOpacity);
7722
8057
  this.color = this.getInitValue('color', props.color, this.color);
7723
- this.dark = this.getInitValue('dark', props.dark, this.dark);
7724
8058
  this.height = this.getInitValue('height', props.height, this.height);
7725
8059
  this.indeterminate = this.getInitValue('indeterminate', props.indeterminate, this.indeterminate);
7726
- this.light = this.getInitValue('light', props.light, this.light);
7727
8060
  this.centerSlot = this.getInitValue('centerSlot', props.centerSlot, this.centerSlot);
7728
8061
  this.value = this.getInitValue('value', props.value, this.value);
7729
8062
  this.createAccessors();
@@ -8661,6 +8994,10 @@ class SelectTree extends TextInput {
8661
8994
  * Defines if field value should be an object
8662
8995
  */
8663
8996
  this.returnObject = false;
8997
+ /**
8998
+ * Prevents load select data when the input is focused
8999
+ */
9000
+ this.preventLoadOnFocus = true;
8664
9001
  /**
8665
9002
  * Field used to make the item disabled
8666
9003
  */
@@ -8693,6 +9030,7 @@ class SelectTree extends TextInput {
8693
9030
  this.dataValue = this.getInitValue('dataValue', props.dataValue, this.dataValue);
8694
9031
  this.dataDisabled = this.getInitValue('dataDisabled', props.dataDisabled, this.dataDisabled);
8695
9032
  this.disabledItems = this.getInitValue('disabledItems', props.disabledItems, this.disabledItems);
9033
+ this.preventLoadOnFocus = this.getInitValue('preventLoadOnFocus', props.preventLoadOnFocus, this.preventLoadOnFocus);
8696
9034
  if (props.datasource && Object.keys(props.datasource).length) {
8697
9035
  this.lazyLoad = props.datasource.lazyLoad !== false;
8698
9036
  const searchFields = Array.isArray(this.dataText) ? this.dataText : [this.dataText];
@@ -8706,6 +9044,24 @@ class SelectTree extends TextInput {
8706
9044
  }
8707
9045
  this.createAccessors();
8708
9046
  }
9047
+ focus(event, element) {
9048
+ const _super = Object.create(null, {
9049
+ focus: { get: () => super.focus }
9050
+ });
9051
+ return __awaiter(this, void 0, void 0, function* () {
9052
+ _super.focus.call(this, event, element);
9053
+ this.afterFocus();
9054
+ });
9055
+ }
9056
+ afterFocus() {
9057
+ var _a;
9058
+ return __awaiter(this, void 0, void 0, function* () {
9059
+ if (!this.preventLoadOnFocus) {
9060
+ yield ((_a = this.datasource) === null || _a === void 0 ? void 0 : _a.get());
9061
+ this.preventLoadOnFocus = true;
9062
+ }
9063
+ });
9064
+ }
8709
9065
  createDataStructure() {
8710
9066
  this.treeDataStructure = new TreeDataStructure({
8711
9067
  datasource: this.datasource,
@@ -8950,6 +9306,40 @@ class SelectTreeMultiple extends SelectTree {
8950
9306
  }
8951
9307
  }
8952
9308
 
9309
+ /**
9310
+ * Base class for SelectableList component.
9311
+ */
9312
+ class SelectableList extends List {
9313
+ constructor(props) {
9314
+ super(props);
9315
+ /**
9316
+ * Specifies whether at least one element must be selected
9317
+ */
9318
+ this.mandatory = false;
9319
+ /**
9320
+ * Defines the maximum number of elements the list has
9321
+ */
9322
+ this.max = undefined;
9323
+ /**
9324
+ * Defines how many elements of the list can be selected at the same time
9325
+ */
9326
+ this.multiple = undefined;
9327
+ /**
9328
+ * Sets the active list-item inside the list-group
9329
+ */
9330
+ this.value = undefined;
9331
+ this.activeClass = this.getInitValue('activeClass', props.activeClass, this.activeClass);
9332
+ this.mandatory = this.getInitValue('mandatory', props.mandatory, this.mandatory);
9333
+ this.max = this.getInitValue('max', props.max, this.max);
9334
+ this.multiple = this.getInitValue('multiple', props.multiple, this.multiple);
9335
+ this.value = this.getInitValue('value', props.value, this.value);
9336
+ this.createAccessors();
9337
+ }
9338
+ change(event, element) {
9339
+ this.callEvent('change', { event, element, component: this });
9340
+ }
9341
+ }
9342
+
8953
9343
  /**
8954
9344
  * Base class for SpeedDial component.
8955
9345
  */
@@ -9033,14 +9423,6 @@ class Steppers extends ComponentRender {
9033
9423
  * Array of steppers items
9034
9424
  */
9035
9425
  this.items = [];
9036
- /**
9037
- * Applies the dark theme variant to the stepper
9038
- */
9039
- this.dark = false;
9040
- /**
9041
- * Applies the light theme variant to the stepper
9042
- */
9043
- this.light = false;
9044
9426
  /**
9045
9427
  * Allow user to jump to any step
9046
9428
  */
@@ -9052,9 +9434,7 @@ class Steppers extends ComponentRender {
9052
9434
  this.activeStep = this.getInitValue('activeStep', props.activeStep, this.activeStep);
9053
9435
  this.altLabels = this.getInitValue('altLabels', props.altLabels, this.altLabels);
9054
9436
  this.content = this.getInitValue('content', props.content, this.content);
9055
- this.dark = this.getInitValue('dark', props.dark, this.dark);
9056
9437
  this.items = this.getInitValue('items', props.items, this.items);
9057
- this.light = this.getInitValue('light', props.light, this.light);
9058
9438
  this.nonLinear = this.getInitValue('nonLinear', props.nonLinear, this.nonLinear);
9059
9439
  this.vertical = this.getInitValue('vertical', props.vertical, this.vertical);
9060
9440
  this.steps = this.getInitValue('steps', props.steps, this.steps);
@@ -9305,6 +9685,7 @@ class Tabs extends ComponentRender {
9305
9685
  this.tabs = [];
9306
9686
  this.tabs = this.getTabs(props.tabs || []);
9307
9687
  this.activeTab = this.getInitValue('activeTab', props.activeTab, this.activeTab);
9688
+ this.height = this.getInitValue('height', props.height, this.height);
9308
9689
  this.createAccessors();
9309
9690
  }
9310
9691
  getTabs(tabs) {
@@ -9317,6 +9698,31 @@ class Tabs extends ComponentRender {
9317
9698
  }
9318
9699
  return tab;
9319
9700
  }
9701
+ /**
9702
+ * Method for navigating to the next tab
9703
+ * @param loop Defines if want a loop navigation
9704
+ */
9705
+ nextTab(loop = false) {
9706
+ if (loop) {
9707
+ this.activeTab = (this.activeTab + 1) % this.tabs.length;
9708
+ }
9709
+ else if (this.activeTab < this.tabs.length - 1) {
9710
+ this.activeTab += 1;
9711
+ }
9712
+ }
9713
+ /**
9714
+ * Method for navigating to the previous tab
9715
+ * @param loop Defines if want a loop navigation
9716
+ */
9717
+ previousTab(loop = false) {
9718
+ if (loop) {
9719
+ const newTabIndex = (this.activeTab - 1) % this.tabs.length;
9720
+ this.activeTab = newTabIndex >= 0 ? newTabIndex : newTabIndex + this.tabs.length;
9721
+ }
9722
+ else if (this.activeTab > 0) {
9723
+ this.activeTab -= 1;
9724
+ }
9725
+ }
9320
9726
  /**
9321
9727
  * Triggered before tab is change.
9322
9728
  * @param event DOM event
@@ -10168,9 +10574,25 @@ class TreeGridEditable extends TreeGrid {
10168
10574
  * Enter edit mode on double click
10169
10575
  */
10170
10576
  this.doubleClickEdit = false;
10577
+ this.cancelEditedRowsKeyMapping = {
10578
+ esc: {
10579
+ event: this.cancelEditedRows.bind(this),
10580
+ stop: true,
10581
+ input: true,
10582
+ active: true,
10583
+ },
10584
+ };
10171
10585
  this.doubleClickEdit = this.getInitValue('doubleClickEdit', props.doubleClickEdit, this.doubleClickEdit);
10172
10586
  this.createAccessors();
10173
10587
  }
10588
+ onMounted(element) {
10589
+ super.onMounted(element);
10590
+ KeyMap.bind(this.cancelEditedRowsKeyMapping, this, element);
10591
+ }
10592
+ onBeforeDestroy() {
10593
+ super.onBeforeDestroy();
10594
+ KeyMap.unbind(this.cancelEditedRowsKeyMapping, this);
10595
+ }
10174
10596
  /**
10175
10597
  * Get Grid columns objects
10176
10598
  * @param columns Grid columns parameter
@@ -10339,7 +10761,7 @@ class TreeGridEditable extends TreeGrid {
10339
10761
  changeEditableComponent(column, row, value, component) {
10340
10762
  const key = row[this.datasource.uniqueKey];
10341
10763
  const columnName = column.name;
10342
- if (!isEqual(value, row[columnName])) {
10764
+ if (!Utils.isEqual(value, row[columnName])) {
10343
10765
  const newRow = {};
10344
10766
  newRow[key] = Object.assign({}, this.editedRows[key]);
10345
10767
  newRow[key].originalRow = Object.assign({}, row);
@@ -10613,6 +11035,12 @@ Icons.mdiIcons = {
10613
11035
  tableColumns: 'mdi-table-headers-eye',
10614
11036
  unfold: 'mdi-unfold-more-horizontal',
10615
11037
  warning: 'mdi-exclamation',
11038
+ zoom: 'mdi-magnify-scan',
11039
+ zoomIn: 'mdi-plus-circle-outline',
11040
+ zoomPanning: 'mdi-hand-back-right-outline',
11041
+ zoomOut: 'mdi-minus-circle-outline',
11042
+ zoomReset: 'mdi-magnify-close',
11043
+ zoomSelection: 'mdi-magnify-scan',
10616
11044
  };
10617
11045
  Icons.faIcons = {
10618
11046
  alertOctagon: 'fa fa-exclamation-circle',
@@ -10663,6 +11091,12 @@ Icons.faIcons = {
10663
11091
  tableColumns: 'fa fa-columns',
10664
11092
  unfold: 'fa fa-sort',
10665
11093
  warning: 'fa fa-exclamation',
11094
+ zoom: 'fa fa-search',
11095
+ zoomIn: 'fa fa-search-plus',
11096
+ zoomPanning: 'fa fa-hand-paper',
11097
+ zoomOut: 'fa fa-search-minus',
11098
+ zoomReset: 'fa fa-undo',
11099
+ zoomSelection: 'fa fa-expand',
10666
11100
  };
10667
11101
  Icons.icons = (() => Icons.mdiIcons)();
10668
11102
 
@@ -10700,10 +11134,14 @@ const defaultTheme = {
10700
11134
  light: {
10701
11135
  'font-color': 'var(--v-grey-darken2)',
10702
11136
  'background-base': '#F6F6F6',
11137
+ 'scrollbar-track': 'var(--v-grey-lighten5)',
11138
+ 'scrollbar-thumb': 'var(--v-grey-lighten4)',
10703
11139
  },
10704
11140
  dark: {
10705
11141
  'font-color': 'var(--v-grey-lighten3)',
10706
11142
  'background-base': '#121212',
11143
+ 'scrollbar-track': 'var(--v-grey-darken3)',
11144
+ 'scrollbar-thumb': 'var(--v-grey-base)',
10707
11145
  },
10708
11146
  variables: {
10709
11147
  'default-padding': '16px',
@@ -10939,6 +11377,16 @@ WatchURL.watchers = {};
10939
11377
  WatchURL.originalEvents = new Map();
10940
11378
 
10941
11379
  class BaseReport {
11380
+ constructor() {
11381
+ this.expressionZeedhiToXls = {
11382
+ AVG: 'AVERAGE',
11383
+ COUNT: 'COUNTA',
11384
+ MAX: 'MAX',
11385
+ MIN: 'MIN',
11386
+ SUM: 'SUM',
11387
+ };
11388
+ this.colunmXLS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
11389
+ }
10942
11390
  buildColumns(columns) {
10943
11391
  const widths = {};
10944
11392
  let totalWidth;
@@ -11165,27 +11613,12 @@ class PDFReport extends BaseReport {
11165
11613
  }
11166
11614
 
11167
11615
  class XLSReport extends BaseReport {
11168
- constructor(type) {
11169
- super();
11616
+ constructor() {
11617
+ super(...arguments);
11170
11618
  this.route = '/generateXLS';
11171
- this.expressionZeedhiToXls = {
11172
- AVG: 'AVERAGE',
11173
- COUNT: 'COUNTA',
11174
- MAX: 'MAX',
11175
- MIN: 'MIN',
11176
- SUM: 'SUM',
11177
- };
11178
- this.colunmXLS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
11179
- this.type = type || 'xls';
11180
11619
  }
11181
- buildDataset(data, columns, metadata) {
11182
- let result;
11183
- if (this.type === 'xls') {
11184
- result = this.formatRawDataSet(data, columns);
11185
- }
11186
- else if (metadata) {
11187
- result = this.formatDataSet(metadata, data);
11188
- }
11620
+ buildDataset(data, columns) {
11621
+ const result = this.formatRawDataSet(data, columns);
11189
11622
  return JSON.stringify(result);
11190
11623
  }
11191
11624
  // formata o dataset para o formato "cru" xls
@@ -11229,27 +11662,55 @@ class XLSReport extends BaseReport {
11229
11662
  };
11230
11663
  return Promise.resolve(JSON.stringify(metadataObj));
11231
11664
  }
11232
- isFormat3(format) {
11233
- return format === 'xls3';
11665
+ }
11666
+
11667
+ // XLS with groups
11668
+ class XLS2Report extends BaseReport {
11669
+ constructor() {
11670
+ super(...arguments);
11671
+ this.route = '/generateXLS';
11234
11672
  }
11235
- // Ordenar o nome das colunas de acordo com seu index, excluindo o nome das colunas agrupadas
11236
- getColumnsNameFormat3(columns, metaData) {
11237
- const columnsNameGroup = metaData.groups.map((row) => row.field);
11238
- let columnsName = [];
11239
- Object.entries(columns).forEach((row) => {
11240
- const columnName = row[0];
11241
- if (columnsNameGroup.indexOf(columnName) === -1) {
11242
- const index = row[1].sequence;
11243
- columnsName[index] = columnName;
11244
- }
11245
- });
11246
- columnsName = columnsName.filter((columnName) => typeof columnName === 'string');
11247
- return columnsName;
11673
+ buildDataset(data, metadata) {
11674
+ const result = this.formatDataSet(metadata, data);
11675
+ return JSON.stringify(result);
11676
+ }
11677
+ buildMetadata(name, title, columns, filter) {
11678
+ const builtCols = this.buildColumns(columns);
11679
+ const builtFilters = this.buildFilter(filter || {});
11680
+ const lang = this.formatLangCode(I18n.instance.language);
11681
+ const clientLogo = '';
11682
+ const enterpriseLogo = '';
11683
+ const productLogo = '';
11684
+ const metadataObj = {
11685
+ name,
11686
+ title,
11687
+ lang,
11688
+ clientLogo,
11689
+ enterpriseLogo,
11690
+ productLogo,
11691
+ version: '1.0',
11692
+ words: {
11693
+ Page: I18n.translate('PAGE'),
11694
+ Report: I18n.translate('REPORT'),
11695
+ Version: I18n.translate('VERSION'),
11696
+ },
11697
+ staticData: {},
11698
+ groups: [],
11699
+ reportName: name,
11700
+ widgetLabel: title,
11701
+ orientation: 'PORTRAIT',
11702
+ columns: builtCols,
11703
+ filter: builtFilters,
11704
+ reportXLS: true,
11705
+ xlsMergedCell: [],
11706
+ };
11707
+ return Promise.resolve(JSON.stringify(metadataObj));
11248
11708
  }
11249
11709
  // Ordenar o nome das colunas de acordo com seu index, e sempre deixando as colunas agrupadas nas primeiras posições
11250
11710
  getColumnsName(columns, metaData, lengthGroup) {
11251
11711
  const columnsNameGroup = metaData.groups.map((row) => row.field);
11252
11712
  let columnsName = [];
11713
+ const columnsGroupName = [];
11253
11714
  Object.entries(columns).forEach((row) => {
11254
11715
  const columnName = row[0];
11255
11716
  const index = row[1].sequence;
@@ -11257,25 +11718,21 @@ class XLSReport extends BaseReport {
11257
11718
  columnsName[index + lengthGroup] = columnName;
11258
11719
  }
11259
11720
  else {
11260
- columnsName[index] = columnName;
11721
+ columnsGroupName.push(columnName);
11261
11722
  }
11262
11723
  });
11724
+ columnsName = columnsGroupName.concat(columnsName);
11263
11725
  columnsName = columnsName.filter((columnName) => typeof columnName === 'string');
11264
11726
  return columnsName;
11265
11727
  }
11266
11728
  // Inicializa alguns valores auxiliares
11267
- initVars(metaData, type) {
11729
+ initVars(metaData) {
11268
11730
  metaData.xlsMergedCell = [];
11269
11731
  const { columns } = metaData;
11270
11732
  const lengthGroup = metaData.groups.length;
11271
11733
  const indexLastGroup = lengthGroup - 1;
11272
11734
  let columnsName = [];
11273
- if (this.isFormat3(type)) {
11274
- columnsName = this.getColumnsNameFormat3(columns, metaData);
11275
- }
11276
- else {
11277
- columnsName = this.getColumnsName(columns, metaData, lengthGroup);
11278
- }
11735
+ columnsName = this.getColumnsName(columns, metaData, lengthGroup);
11279
11736
  const rowValues = [];
11280
11737
  const formatedDataSet = [];
11281
11738
  const groups = [];
@@ -11285,33 +11742,6 @@ class XLSReport extends BaseReport {
11285
11742
  columns, indexLastGroup, columnsName, rowValues, formatedDataSet, groups,
11286
11743
  };
11287
11744
  }
11288
- // formata a linha do grupo de acordo com o formato xls3
11289
- setRowGroupFormat3(row, rowValuesParam, groups, formatedDataSet, columnsName, columns, indexLastGroup) {
11290
- let rowValues = rowValuesParam;
11291
- const label = `${row.groupLabel}:${row.groupValue}`;
11292
- const index = row.groupIndex;
11293
- if (row.groupHeader) {
11294
- rowValues[index] = label;
11295
- groups[index] = { init: null, end: null };
11296
- formatedDataSet.push(rowValues);
11297
- rowValues = [];
11298
- }
11299
- else if (row.groupFooter) {
11300
- if (!row.groupLabel) {
11301
- rowValues.push('Total');
11302
- }
11303
- else {
11304
- rowValues.push(`Total (${label})`);
11305
- }
11306
- formatedDataSet.push(rowValues);
11307
- rowValues = [];
11308
- const funcXls = null;
11309
- columnsName.forEach((column) => {
11310
- this.formatRowFunc(column, columns, row, index, rowValues, funcXls, groups, indexLastGroup);
11311
- });
11312
- }
11313
- return rowValues;
11314
- }
11315
11745
  // formata as expressões da linha
11316
11746
  formatRowFunc(column, columns, row, index, rowValues, funcXlsParam, groups, indexLastGroup) {
11317
11747
  let funcXls = funcXlsParam;
@@ -11410,18 +11840,199 @@ class XLSReport extends BaseReport {
11410
11840
  });
11411
11841
  }
11412
11842
  formatDataSet(metaData, dataSet) {
11413
- const initVars = this.initVars(metaData, this.type);
11843
+ const initVars = this.initVars(metaData);
11414
11844
  const { columns, indexLastGroup, columnsName, formatedDataSet, groups, } = initVars;
11415
11845
  let { rowValues } = initVars;
11416
11846
  dataSet.forEach((row) => {
11417
11847
  if (row.group || row.groupFooter) {
11418
- if (this.isFormat3(this.type)) {
11419
- rowValues = this.setRowGroupFormat3(row, rowValues, groups, formatedDataSet, columnsName, columns, indexLastGroup);
11848
+ rowValues = this.setRowGroup(row, rowValues, groups, metaData, formatedDataSet, columnsName, columns, indexLastGroup);
11849
+ }
11850
+ else {
11851
+ this.setIndexGroups(groups, formatedDataSet);
11852
+ this.setRowNormal(columnsName, rowValues, row);
11853
+ }
11854
+ if (!row.groupHeader) {
11855
+ formatedDataSet.push(rowValues);
11856
+ }
11857
+ rowValues = [];
11858
+ });
11859
+ return [columnsName].concat(formatedDataSet);
11860
+ }
11861
+ }
11862
+
11863
+ // Grid mirror (with groups)
11864
+ class XLS3Report extends BaseReport {
11865
+ constructor() {
11866
+ super(...arguments);
11867
+ this.route = '/generateXLS';
11868
+ }
11869
+ buildDataset(data, metadata) {
11870
+ const result = this.formatDataSet(metadata, data);
11871
+ return JSON.stringify(result);
11872
+ }
11873
+ buildMetadata(name, title, columns, filter) {
11874
+ const builtCols = this.buildColumns(columns);
11875
+ const builtFilters = this.buildFilter(filter || {});
11876
+ const lang = this.formatLangCode(I18n.instance.language);
11877
+ const clientLogo = '';
11878
+ const enterpriseLogo = '';
11879
+ const productLogo = '';
11880
+ const metadataObj = {
11881
+ name,
11882
+ title,
11883
+ lang,
11884
+ clientLogo,
11885
+ enterpriseLogo,
11886
+ productLogo,
11887
+ version: '1.0',
11888
+ words: {
11889
+ Page: I18n.translate('PAGE'),
11890
+ Report: I18n.translate('REPORT'),
11891
+ Version: I18n.translate('VERSION'),
11892
+ },
11893
+ staticData: {},
11894
+ groups: [],
11895
+ reportName: name,
11896
+ widgetLabel: title,
11897
+ orientation: 'PORTRAIT',
11898
+ columns: builtCols,
11899
+ filter: builtFilters,
11900
+ reportXLS: true,
11901
+ xlsMergedCell: [],
11902
+ };
11903
+ return Promise.resolve(JSON.stringify(metadataObj));
11904
+ }
11905
+ // Ordenar o nome das colunas de acordo com seu index, excluindo o nome das colunas agrupadas
11906
+ getColumnsNameFormat3(columns, metaData) {
11907
+ const columnsNameGroup = metaData.groups.map((row) => row.field);
11908
+ let columnsName = [];
11909
+ Object.entries(columns).forEach((row) => {
11910
+ const columnName = row[0];
11911
+ if (columnsNameGroup.indexOf(columnName) === -1) {
11912
+ const index = row[1].sequence;
11913
+ columnsName[index] = columnName;
11914
+ }
11915
+ });
11916
+ columnsName = columnsName.filter((columnName) => typeof columnName === 'string');
11917
+ return columnsName;
11918
+ }
11919
+ // Inicializa alguns valores auxiliares
11920
+ initVars(metaData) {
11921
+ metaData.xlsMergedCell = [];
11922
+ const { columns } = metaData;
11923
+ const lengthGroup = metaData.groups.length;
11924
+ const indexLastGroup = lengthGroup - 1;
11925
+ let columnsName = [];
11926
+ columnsName = this.getColumnsNameFormat3(columns, metaData);
11927
+ const rowValues = [];
11928
+ const formatedDataSet = [];
11929
+ const groups = [];
11930
+ groups.groupEnd = {};
11931
+ groups.groupEnd.cellsfunc = {};
11932
+ return {
11933
+ columns, indexLastGroup, columnsName, rowValues, formatedDataSet, groups,
11934
+ };
11935
+ }
11936
+ // formata a linha do grupo de acordo com o formato xls3
11937
+ setRowGroupFormat(row, rowValuesParam, groups, formatedDataSet, columnsName, columns, indexLastGroup) {
11938
+ let rowValues = rowValuesParam;
11939
+ const label = `${row.groupLabel}:${row.groupValue}`;
11940
+ const index = row.groupIndex;
11941
+ if (row.groupHeader) {
11942
+ rowValues[index] = label;
11943
+ groups[index] = { init: null, end: null };
11944
+ formatedDataSet.push(rowValues);
11945
+ rowValues = [];
11946
+ }
11947
+ else if (row.groupFooter) {
11948
+ if (!row.groupLabel) {
11949
+ rowValues.push('Total');
11950
+ }
11951
+ else {
11952
+ rowValues.push(`Total (${label})`);
11953
+ }
11954
+ formatedDataSet.push(rowValues);
11955
+ rowValues = [];
11956
+ const funcXls = null;
11957
+ columnsName.forEach((column) => {
11958
+ this.formatRowFunc(column, columns, row, index, rowValues, funcXls, groups, indexLastGroup);
11959
+ });
11960
+ }
11961
+ return rowValues;
11962
+ }
11963
+ // formata as expressões da linha
11964
+ formatRowFunc(column, columns, row, index, rowValues, funcXlsParam, groups, indexLastGroup) {
11965
+ let funcXls = funcXlsParam;
11966
+ if ((row[column] === 0 || row[column]) && index !== undefined) {
11967
+ const letter = this.colunmXLS[rowValues.length];
11968
+ funcXls = this.expressionZeedhiToXls[columns[column].expression];
11969
+ const cellsfunc = `${letter + groups[index].init}:${letter}${groups[index].end}`;
11970
+ let expression = '';
11971
+ if (indexLastGroup === index) {
11972
+ expression = `=${funcXls}(${cellsfunc})`;
11973
+ }
11974
+ else {
11975
+ expression = `=${funcXls}(${groups[index].cellsfunc[column]})`;
11976
+ if (index === 0) {
11977
+ if (groups.groupEnd.cellsfunc[column]) {
11978
+ groups.groupEnd.cellsfunc[column] += `,${groups[index].cellsfunc[column]}`;
11979
+ }
11980
+ else {
11981
+ groups.groupEnd.cellsfunc[column] = groups[index].cellsfunc[column];
11982
+ }
11420
11983
  }
11421
- else {
11422
- rowValues = this.setRowGroup(row, rowValues, groups, metaData, formatedDataSet, columnsName, columns, indexLastGroup);
11984
+ groups[index].cellsfunc[column] = null;
11985
+ }
11986
+ rowValues.push(expression);
11987
+ groups.forEach((group, indexGroup) => {
11988
+ if (indexGroup !== indexLastGroup) {
11989
+ if (!group.cellsfunc) {
11990
+ group.cellsfunc = {};
11991
+ }
11992
+ if (group.cellsfunc[column]) {
11993
+ group.cellsfunc[column] += `,${cellsfunc}`;
11994
+ }
11995
+ else {
11996
+ group.cellsfunc[column] = cellsfunc;
11997
+ }
11998
+ }
11999
+ });
12000
+ }
12001
+ else {
12002
+ let cell = row[column];
12003
+ if (row.groupSummary) {
12004
+ const groupEndFunc = groups.groupEnd.cellsfunc;
12005
+ if (groupEndFunc[column]) {
12006
+ funcXls = this.expressionZeedhiToXls[columns[column].expression];
12007
+ cell = `=${funcXls}(${groupEndFunc[column]})`;
11423
12008
  }
11424
12009
  }
12010
+ rowValues.push(cell);
12011
+ }
12012
+ }
12013
+ // Defina o index dos grupos
12014
+ setIndexGroups(groups, formatedDataSet) {
12015
+ groups.forEach((group) => {
12016
+ if (!group.init) {
12017
+ group.init = formatedDataSet.length + 2;
12018
+ }
12019
+ group.end = formatedDataSet.length + 2;
12020
+ });
12021
+ }
12022
+ // Preenche uma linha "normal"
12023
+ setRowNormal(columnsName, rowValues, row) {
12024
+ columnsName.forEach((column) => {
12025
+ rowValues.push(row[column]);
12026
+ });
12027
+ }
12028
+ formatDataSet(metaData, dataSet) {
12029
+ const initVars = this.initVars(metaData);
12030
+ const { columns, indexLastGroup, columnsName, formatedDataSet, groups, } = initVars;
12031
+ let { rowValues } = initVars;
12032
+ dataSet.forEach((row) => {
12033
+ if (row.group || row.groupFooter) {
12034
+ rowValues = this.setRowGroupFormat(row, rowValues, groups, formatedDataSet, columnsName, columns, indexLastGroup);
12035
+ }
11425
12036
  else {
11426
12037
  this.setIndexGroups(groups, formatedDataSet);
11427
12038
  this.setRowNormal(columnsName, rowValues, row);
@@ -11468,8 +12079,14 @@ class Report {
11468
12079
  if (type === 'pdf') {
11469
12080
  return new PDFReport();
11470
12081
  }
11471
- if (type === 'xls' || type === 'xls2' || type === 'xls3') {
11472
- return new XLSReport(type);
12082
+ if (type === 'xls') {
12083
+ return new XLSReport();
12084
+ }
12085
+ if (type === 'xls2') {
12086
+ return new XLS2Report();
12087
+ }
12088
+ if (type === 'xls3') {
12089
+ return new XLS3Report();
11473
12090
  }
11474
12091
  throw new Error(`Invalid report type: ${type}`);
11475
12092
  }
@@ -11488,10 +12105,10 @@ class Report {
11488
12105
  const formattedColumns = this.removeActionColumns(columns);
11489
12106
  const metadataObj = yield reportType.buildMetadata(name, this.title, formattedColumns, datasource.filter, portrait);
11490
12107
  let dataset;
11491
- if ((reportType.type === 'xls2' || reportType.type === 'xls3') && groupedData) {
12108
+ if ((reportType instanceof XLS2Report || reportType instanceof XLS3Report) && groupedData) {
11492
12109
  const rowMetadata = rowObj.metaData;
11493
12110
  const metadataObjClone = merge(rowMetadata, JSON.parse(metadataObj));
11494
- dataset = reportType.buildDataset(groupedData, formattedColumns, metadataObjClone);
12111
+ dataset = reportType.buildDataset(groupedData, metadataObjClone);
11495
12112
  }
11496
12113
  else {
11497
12114
  dataset = reportType.buildDataset(data, formattedColumns);
@@ -11534,4 +12151,4 @@ class Report {
11534
12151
 
11535
12152
  const AutoNumeric = require('@zeedhi/autonumeric/dist/autoNumeric');
11536
12153
 
11537
- export { Alert, AlertService, ApexChart, AutoNumeric, Badge, Breadcrumbs, Button, ButtonGroup, CSVReport, Card, Carousel, Checkbox, CheckboxMultiple, ChildNotFoundError, Chip, CodeEditor, Col, CollapseCard, Column, Component, ComponentRender, Container, Currency, Dashboard, Date$1 as Date, DateRange, Dialog, DialogService, Divider, Dropdown, FileInput, Footer, Form, Frame, FramePage, Grid, GridColumn, GridColumnEditable, GridEditable, Header, Icon, Icons, Image, Increment, Input, Iterable, IterableColumnsButton, IterableColumnsButtonController, IterablePageComponent, IterablePageInfo, IterablePageSize, IterablePagination, List, ListGroup, ListItem, Loading, LoadingService, Login, LoginButton, MasterDetail, Menu, MenuButton, MenuGroup, MenuLink, MenuSeparator, Modal, ModalCloseButton, ModalService, Month, Number$1 as Number, PDFReport, Password, Progress, Radio, RangeSlider, Report, Row, Search, Select, SelectMultiple, SelectTree, SelectTreeMultiple, SpeedDial, Steppers, SvgMap, Switch, Tab, Table, Tabs, Tag, Text, TextInput, Textarea, Time, Toggleable, Tooltip, Tree, TreeDataStructure, TreeGrid, TreeGridEditable, WatchURL, XLSReport, initTheme };
12154
+ export { Alert, AlertService, ApexChart, AutoNumeric, Badge, Breadcrumbs, Button, ButtonGroup, CSVReport, Card, Carousel, Checkbox, CheckboxMultiple, ChildNotFoundError, Chip, CodeEditor, Col, CollapseCard, Column, Component, ComponentRender, Container, Currency, Dashboard, Date$1 as Date, DateRange, Dialog, DialogService, Divider, Dropdown, FileInput, Footer, Form, Frame, FramePage, Grid, GridColumn, GridColumnEditable, GridEditable, Header, Icon, Icons, Image, Increment, Input, Iterable, IterableColumnsButton, IterableColumnsButtonController, IterablePageComponent, IterablePageInfo, IterablePageSize, IterablePagination, List, ListGroup, ListItem, Loading, LoadingService, Login, LoginButton, MasterDetail, Menu, MenuButton, MenuGroup, MenuLink, MenuSeparator, Modal, ModalCloseButton, ModalService, Month, Number$1 as Number, PDFReport, Password, Progress, Radio, RangeSlider, Report, Row, Search, Select, SelectMultiple, SelectTree, SelectTreeMultiple, SelectableList, SpeedDial, Steppers, SvgMap, Switch, Tab, Table, Tabs, Tag, Text, TextInput, Textarea, Time, Toggleable, Tooltip, Tree, TreeDataStructure, TreeGrid, TreeGridEditable, WatchURL, XLS2Report, XLS3Report, XLSReport, initTheme };