@zeedhi/teknisa-components-common 1.37.0 → 1.41.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 (31) hide show
  1. package/coverage/clover.xml +789 -617
  2. package/coverage/coverage-final.json +30 -27
  3. package/coverage/lcov-report/block-navigation.js +8 -0
  4. package/coverage/lcov-report/index.html +55 -19
  5. package/coverage/lcov-report/sorter.js +26 -0
  6. package/coverage/lcov.info +1506 -1181
  7. package/dist/tek-components-common.esm.js +1808 -1347
  8. package/dist/tek-components-common.umd.js +1808 -1344
  9. package/package.json +2 -2
  10. package/tests/unit/components/tek-datasource/memory-datasource.spec.ts +20 -4
  11. package/tests/unit/components/tek-grid/filter-helper.spec.ts +145 -0
  12. package/tests/unit/components/tek-grid/grid.spec.ts +376 -58
  13. package/tests/unit/components/tek-grid/layout_options.spec.ts +58 -0
  14. package/tests/unit/components/tek-loading/Loading.spec.ts +30 -0
  15. package/tests/unit/components/tree-grid/tree-grid.spec.ts +469 -0
  16. package/tests/unit/{components/tek-grid → utils/grid-base}/grid-controller.spec.ts +3 -3
  17. package/types/components/index.d.ts +5 -0
  18. package/types/components/tek-datasource/memory-datasource.d.ts +1 -0
  19. package/types/components/tek-grid/filter-dynamic-values.d.ts +9 -0
  20. package/types/components/tek-grid/filter-helper.d.ts +9 -0
  21. package/types/components/tek-grid/grid-columns-button.d.ts +2 -0
  22. package/types/components/tek-grid/grid.d.ts +12 -19
  23. package/types/components/tek-grid/interfaces.d.ts +15 -1
  24. package/types/components/tek-grid/layout-options.d.ts +3 -2
  25. package/types/components/tek-loading/interfaces.d.ts +6 -0
  26. package/types/components/tek-loading/loading.d.ts +24 -0
  27. package/types/components/tek-tree-grid/interfaces.d.ts +19 -0
  28. package/types/components/tek-tree-grid/tree-grid.d.ts +76 -0
  29. package/types/utils/grid-base/grid-base.d.ts +267 -0
  30. package/types/utils/grid-base/grid-controller.d.ts +20 -0
  31. package/types/utils/index.d.ts +3 -1
@@ -555,6 +555,36 @@
555
555
  }
556
556
  }
557
557
 
558
+ // eslint-disable-next-line
559
+ const loading = 'data:image/gif;base64,R0lGODlhlgCWAPf/AC1oxPa+ADarUdmsFEB/m0yTcjiMhEafWjFova2SNDZotX10VsOfJDlosFZnge25BnJtXTukVWVmaFh1eIuOZ1x0ZEFopHpyWGFpcS5ow+q2CVNnhmVnZvW9AW5qYUyKXUJnofW+AKWNOV9mcS9owZuGQTporlCGXbWXLmNrazxnqeKyDoGDZVFniFZ6ZNSpGJ+IPoR4Ud+wEURnnmtpYklnlll5YbGUMcagIk5njmhnZWpoZGF0aWBmbkdnmbyaKUtnlEaBfWdmZTNou0WUW5WDRFtmeGZmZ82kHqecTXqIdzRouGJmbPC6BIB2VDxnrGNmakyHYPO8AkxnkUh0qmRpZl9wZVxndmRmaVhnffS9AqmPN09ni96vEUmQWzBowC1ow2FtZVR3gl5ndFGCYEVnnF1mdGR9i1dnf7qZK4l7TnRvXOK1FD6eV8ijIG6Cgl58lF1rfEBnpFVsi1pmeo5+Sk56dz9np5OCRjaqUi5pxNarFndwWmNqZm9sYFx7a098itGnG4d6T7ikPKKLO1Rmg+e1Cr2bKVhme0GbVkpmk5mWW5GBSM+nHLiYLPG7BIp8TUKZWUFsqWJnbltmd0hnmNqtFExtm1tsgaiOOIx9TNuuE6CKPWJmbcqjH1OJb8CdJjFovlpwb+u5CzioU1aFbjdos0qYXJOPXWFwczepUnBsX8qrKuW0DD5nqdmsFUl+kTtnrDdntNKuI+OzDVRnhYuEV52HPzNqvjltuVBqkJeERNirFnVvXKSMOjVsvDmLhEJxsTloss+sJTeqUdyzGkaeWreYLmBqdjmMhDyhVvC8B49/STinVVV+YVp/bEuScq6fRj5tr8CnNUV/lUNnoGZnZkCFgTaqUVeCYTuLgz2Ig02RcUySck+QcTxpr5qQUFCPXjZsullviFh4ZNaxH0KAmEGYXFJ4oFCNcEdsoUicWpmFQkRooEFvsHt5YDepUXBvYzyKhESXWkeeWjxutcWlK250bYp+UFCQcGZoaLyeLtitFaGSR0OYV2ZmZiH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LmRhYmFjYmIsIDIwMjEvMDQvMTQtMDA6Mzk6NDQgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMy4wIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEMEVGRUY5RjYzRjYxMUVDQkRFNUM0MjQ5M0FFRTY2RSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEMEVGRUZBMDYzRjYxMUVDQkRFNUM0MjQ5M0FFRTY2RSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQwRUZFRjlENjNGNjExRUNCREU1QzQyNDkzQUVFNjZFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQwRUZFRjlFNjNGNjExRUNCREU1QzQyNDkzQUVFNjZFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1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3cr155ExDjZsyDKiK8weU4R9AcAWTCgTLcyulFBrCdu7eAHITSmhEpi8gPeirJEBcGDBJR0UNpwXMUksChgfdhxyg+TJlD/eudw480cmdjnf9fxxDAnRo0l3vII6teqNZhajfs1xBILWemlrlNAAt+6NNXz/zjji9OzhGSu1Rp6RSW/RzDOaicw5esZJrqpbx4iFiynZd0mYgtiuEQuaSndMmJAzhY4E8vDjy59Pv779+/jz69/Pv7///wAGKOCABBZo4IEIJqjgggw26OCDEEYo4YQUVmjhhRhmqOGGHHbo4YcghijiiCSWaOKJKKao4oostujiizDGKOOMNNZo44045qjjjjz26OOPQAYp5JBEFmnkkUgmqSRVAQEAIfkEBQQA/wAsAAAAAJYAlgAACPEA/wkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5cuYM2vezLmz58+gQ4seTbq06dOoU6tezbq169ewY8ueTbu27du4c+vezbu379/AgwsfTry48ePIkytfzry58+fQo0ufbjggACH5BAUEAP8ALAAAAAABAAEAAAgEAP8FBAA7';
560
+ /**
561
+ * Teknisa component
562
+ */
563
+ class Loading extends common.ComponentRender {
564
+ /**
565
+ * Creates a new instance of TekLoading
566
+ * @param props Image Link props
567
+ */
568
+ constructor(props) {
569
+ super(props);
570
+ /**
571
+ * text to show in Loader Overlay
572
+ */
573
+ this.text = '';
574
+ /**
575
+ * zIndex value.
576
+ */
577
+ this.zIndex = '999';
578
+ /**
579
+ * loading path.
580
+ */
581
+ this.image = loading;
582
+ this.text = this.getInitValue('text', props.text, this.text);
583
+ this.zIndex = this.getInitValue('zIndex', props.zIndex, this.zIndex);
584
+ this.image = this.getInitValue('image', props.image, this.image);
585
+ }
586
+ }
587
+
558
588
  /**
559
589
  * Notifications component is used to show notifications
560
590
  */
@@ -682,568 +712,796 @@
682
712
  }
683
713
  }
684
714
 
685
- const DynamicFilterOperations = {
686
- CONTAINS: true,
687
- NOT_CONTAINS: true,
688
- EQUALS: true,
689
- NOT_EQUALS: true,
690
- GREATER_THAN: true,
691
- LESS_THAN: true,
692
- GREATER_THAN_EQUALS: true,
693
- LESS_THAN_EQUALS: true,
694
- IN: true,
695
- NOT_IN: true,
696
- BETWEEN: true,
697
- };
698
- const DynamicFilterRelations = {
699
- AND: true,
700
- OR: true,
701
- };
702
-
703
- class TekRestDatasource extends core.RestDatasource {
704
- /**
705
- * Create new datasource
706
- * @param props Datasource properties
707
- */
708
- constructor(props) {
709
- super(Object.assign(Object.assign({}, props), { lazyLoad: true }));
710
- /**
711
- * Dynamic Filter Operations
712
- */
713
- this.dynamicFilterOperations = DynamicFilterOperations;
714
- /**
715
- * Dynamic Filter Relations
716
- */
717
- this.dynamicFilterRelations = DynamicFilterRelations;
718
- /**
719
- * Dynamic Filter applied flag
720
- */
721
- this.dynamicFilterApplied = '';
722
- if (!this.watchUrl) {
723
- this.dynamicFilter = this.getInitValue('dynamicFilter', props.dynamicFilter, {});
724
- this.searchJoin = this.getInitValue('searchJoin', props.searchJoin, {});
725
- }
726
- this.lazyLoad = this.getInitValue('lazyLoad', props.lazyLoad, this.lazyLoad);
727
- this.createAccessors();
728
- if (!this.lazyLoad) {
729
- this.get();
730
- }
715
+ class GridBase {
716
+ constructor(grid) {
717
+ this.exportConfigButtons = [];
718
+ this.grid = grid;
719
+ this.exportConfigButtons = this.getExportConfigButtons();
731
720
  }
732
- updateReservedKeys() {
733
- this.reservedKeys.dynamic_filter = true;
734
- this.reservedKeys.search_join = true;
721
+ getExportConfigButtons() {
722
+ return this.grid.exportConfig.map((config) => {
723
+ const { type, label, portrait = true, iconName, } = config;
724
+ const orientation = portrait ? 'portrait' : 'landscape';
725
+ return {
726
+ label,
727
+ iconName,
728
+ name: `${this.grid.name}_export_${type}_${orientation}`,
729
+ component: 'ZdButton',
730
+ flat: true,
731
+ events: {
732
+ click: () => this.grid.getReport(type, portrait),
733
+ },
734
+ };
735
+ });
735
736
  }
736
- updateInternalProperties(datasource = {}) {
737
- if (!this.watchUrl)
738
- return;
739
- this.updateReservedKeys();
740
- super.updateInternalProperties(datasource);
741
- const queryString = core.URL.getParsedQueryStringFromUrl();
742
- this.dynamicFilter = this.getEncodedParam(queryString.dynamic_filter, datasource.dynamicFilter);
743
- this.searchJoin = this.getEncodedParam(queryString.search_join, datasource.searchJoin);
737
+ createToolbarProps() {
738
+ return [
739
+ {
740
+ name: `${this.grid.name}_gridTitle`,
741
+ component: 'ZdText',
742
+ cssClass: 'toolbar-title',
743
+ tag: 'h2',
744
+ text: this.grid.title,
745
+ title: this.grid.title,
746
+ },
747
+ {
748
+ name: `${this.grid.name}_spacer`,
749
+ component: 'VSpacer',
750
+ },
751
+ {
752
+ name: `${this.grid.name}_notEditingSpan`,
753
+ component: 'ZdTag',
754
+ tag: 'span',
755
+ cssStyle: 'display: flex',
756
+ isVisible: `{{GridController_${this.grid.componentId}.isNotEditing}}`,
757
+ children: [
758
+ {
759
+ name: `${this.grid.name}_add_tooltip`,
760
+ component: 'ZdTooltip',
761
+ label: 'TEKGRID_ADD',
762
+ bottom: true,
763
+ children: [
764
+ {
765
+ name: `${this.grid.name}_addButton`,
766
+ component: 'ZdButton',
767
+ icon: true,
768
+ iconName: 'add',
769
+ isVisible: `{{GridController_${this.grid.componentId}.showAddButton}}`,
770
+ events: {
771
+ click: this.addButtonClick.bind(this),
772
+ },
773
+ },
774
+ ],
775
+ },
776
+ {
777
+ name: `${this.grid.name}_delete_tooltip`,
778
+ component: 'ZdTooltip',
779
+ label: 'TEKGRID_DELETE',
780
+ bottom: true,
781
+ children: [
782
+ {
783
+ name: `${this.grid.name}_deleteButton`,
784
+ component: 'ZdButton',
785
+ icon: true,
786
+ iconName: 'delete',
787
+ isVisible: `{{GridController_${this.grid.componentId}.showDeleteButton}}`,
788
+ disabled: `{{GridController_${this.grid.componentId}.disableDeleteButton}}`,
789
+ events: {
790
+ click: this.deleteButtonClick.bind(this),
791
+ },
792
+ },
793
+ ],
794
+ },
795
+ {
796
+ name: `${this.grid.name}_divider1`,
797
+ component: 'ZdDivider',
798
+ cssClass: 'toolbar-divider',
799
+ vertical: true,
800
+ isVisible: `{{GridController_${this.grid.componentId}.showFirstDivider}}`,
801
+ },
802
+ {
803
+ name: `${this.grid.name}_refresh_tooltip`,
804
+ component: 'ZdTooltip',
805
+ label: 'TEKGRID_REFRESH',
806
+ bottom: true,
807
+ children: [
808
+ {
809
+ name: `${this.grid.name}_refreshButton`,
810
+ component: 'ZdButton',
811
+ icon: true,
812
+ iconName: 'refresh',
813
+ isVisible: this.grid.showReload,
814
+ events: {
815
+ click: this.reloadGrid.bind(this),
816
+ },
817
+ },
818
+ ],
819
+ },
820
+ {
821
+ name: `${this.grid.name}_divider2`,
822
+ component: 'ZdDivider',
823
+ cssClass: 'toolbar-divider',
824
+ vertical: true,
825
+ isVisible: `{{GridController_${this.grid.componentId}.showLayoutOptions}`,
826
+ },
827
+ {
828
+ name: `${this.grid.name}_columns_button_tooltip`,
829
+ component: 'ZdTooltip',
830
+ label: 'TEKGRID_COLUMNS',
831
+ bottom: true,
832
+ children: [
833
+ {
834
+ name: `${this.grid.name}_columnsButton`,
835
+ component: 'TekGridColumnsButton',
836
+ isVisible: `{{GridController_${this.grid.componentId}.showColumnsButton}}`,
837
+ iterableComponentName: this.grid.name,
838
+ hideGroups: !(this.grid instanceof TekGrid),
839
+ ignoreColumns: `{{GridController_${this.grid.componentId}.columnsButtonIgnore}}`,
840
+ },
841
+ ],
842
+ },
843
+ {
844
+ name: `${this.grid.name}_layout_options`,
845
+ component: 'TekGridLayoutOptions',
846
+ isVisible: `{{GridController_${this.grid.componentId}.showLayoutOptions}}`,
847
+ },
848
+ {
849
+ name: `${this.grid.name}_dividerActions`,
850
+ component: 'ZdDivider',
851
+ cssClass: 'toolbar-divider',
852
+ vertical: true,
853
+ isVisible: `{{GridController_${this.grid.componentId}.showActionAndExportButton}}`,
854
+ },
855
+ {
856
+ name: `${this.grid.name}_export_dropdown`,
857
+ component: 'ZdDropdown',
858
+ cssClass: 'tekgrid-actions-dropdown',
859
+ offsetY: true,
860
+ activator: {
861
+ name: `${this.grid.name}_exportButton`,
862
+ component: 'ZdButton',
863
+ icon: true,
864
+ iconName: 'fileDownload',
865
+ isVisible: `{{GridController_${this.grid.componentId}.showExportButton}}`,
866
+ },
867
+ children: this.grid.exportActions || this.exportConfigButtons,
868
+ },
869
+ {
870
+ name: `${this.grid.name}_actions_dropdown`,
871
+ component: 'ZdDropdown',
872
+ cssClass: 'tekgrid-actions-dropdown',
873
+ offsetY: true,
874
+ activator: {
875
+ name: `${this.grid.name}_actionsButton`,
876
+ component: 'ZdButton',
877
+ icon: true,
878
+ iconName: 'more',
879
+ isVisible: `{{GridController_${this.grid.componentId}.showActionsButton}}`,
880
+ },
881
+ children: this.grid.actions,
882
+ },
883
+ {
884
+ name: `${this.grid.name}_divider3`,
885
+ component: 'ZdDivider',
886
+ cssClass: 'toolbar-divider',
887
+ vertical: true,
888
+ },
889
+ ],
890
+ },
891
+ {
892
+ name: `${this.grid.name}_saveButton`,
893
+ component: 'ZdButton',
894
+ label: 'TEKGRID_SAVE',
895
+ isVisible: `{{GridController_${this.grid.componentId}.isEditing}}`,
896
+ small: true,
897
+ events: {
898
+ click: this.saveChanges.bind(this),
899
+ },
900
+ },
901
+ {
902
+ name: `${this.grid.name}_cancelButton`,
903
+ component: 'ZdButton',
904
+ label: 'TEKGRID_CANCEL',
905
+ outline: true,
906
+ cssClass: 'zd-mx-2',
907
+ isVisible: `{{GridController_${this.grid.componentId}.isEditing}}`,
908
+ small: true,
909
+ events: {
910
+ click: this.cancelChanges.bind(this),
911
+ },
912
+ },
913
+ {
914
+ name: `${this.grid.name}_gridSearch`,
915
+ component: 'ZdSearch',
916
+ },
917
+ {
918
+ name: `${this.grid.name}_filter_tooltip`,
919
+ component: 'ZdTooltip',
920
+ label: 'TEKGRID_FILTER',
921
+ bottom: true,
922
+ children: [
923
+ {
924
+ name: `${this.grid.name}_filterButton`,
925
+ component: 'ZdButton',
926
+ icon: true,
927
+ iconName: 'filter',
928
+ isVisible: `{{GridController_${this.grid.componentId}.showFilterButton}}`,
929
+ events: {
930
+ click: this.filterClick.bind(this),
931
+ },
932
+ },
933
+ ],
934
+ },
935
+ ];
744
936
  }
745
- getEncodedParam(urlParam, datasourceParam = {}) {
746
- return urlParam ? JSON.parse(atob(urlParam)) : datasourceParam;
937
+ addButtonClick({ event }) {
938
+ if (this.grid.events.addClick) {
939
+ this.grid.events.addClick({ component: this, event });
940
+ }
747
941
  }
748
- getQueryStringValues() {
749
- const values = super.getQueryStringValues();
750
- if (this.dynamicFilter && Object.keys(this.dynamicFilter).length) {
751
- values.dynamic_filter = btoa(JSON.stringify(this.dynamicFilter));
942
+ deleteButtonClick({ event }) {
943
+ if (this.grid.events.beforeDelete) {
944
+ this.grid.events.beforeDelete({ component: this, event });
752
945
  }
753
- if (this.searchJoin && Object.keys(this.searchJoin).length) {
754
- values.search_join = btoa(JSON.stringify(this.searchJoin));
946
+ if (!event.defaultPrevented) {
947
+ this.grid.deleteRows();
948
+ if (this.grid.events.afterDelete) {
949
+ this.grid.events.afterDelete({ component: this });
950
+ }
755
951
  }
756
- return values;
757
952
  }
758
- getUrlQueryString() {
759
- const superQueryString = super.getUrlQueryString();
760
- const query = core.URL.getParsedQueryStringFromUrl();
761
- let dynamicFilterQuerystring = '';
762
- if (query.dynamic_filter) {
763
- dynamicFilterQuerystring = `&${core.URL.getFormattedQueryString({
764
- dynamic_filter: query.dynamic_filter,
765
- })}`;
953
+ reloadGrid() {
954
+ this.grid.reload();
955
+ }
956
+ saveChanges({ event }) {
957
+ if (this.grid.events.beforeSave) {
958
+ this.grid.events.beforeSave({ component: this, event });
766
959
  }
767
- let searchJoinQuerystring = '';
768
- if (query.search_join) {
769
- searchJoinQuerystring = `&${core.URL.getFormattedQueryString({
770
- search_join: query.search_join,
771
- })}`;
960
+ if (!event.defaultPrevented) {
961
+ this.grid.saveEditedRows();
962
+ if (this.grid.events.afterSave) {
963
+ this.grid.events.afterSave({ component: this });
964
+ }
772
965
  }
773
- return superQueryString + dynamicFilterQuerystring + searchJoinQuerystring;
774
966
  }
775
- /**
776
- * Adds a new dynamic filter position or replace if exists
777
- * @param column Dynamic Filter column name
778
- * @param value Dynamic Filter value
779
- * @returns Promise with data collection
780
- */
781
- addDynamicFilter(column, value) {
782
- if (this.isValidDynamicFilterValue(column, value)) {
783
- this.dynamicFilter[column] = value;
784
- return this.updateDynamicFilter();
967
+ cancelChanges({ event }) {
968
+ if (this.grid.events.beforeCancel) {
969
+ this.grid.events.beforeCancel({ component: this, event });
970
+ }
971
+ if (!event.defaultPrevented) {
972
+ this.grid.cancelEditedRows();
973
+ if (this.grid.events.afterCancel) {
974
+ this.grid.events.afterCancel({ component: this });
975
+ }
785
976
  }
786
- return this.removeDynamicFilter(column);
787
977
  }
788
- /**
789
- * Removes a dynamic filter position
790
- * @param column Dynamic Filter column name
791
- * @returns Promise with data collection
792
- */
793
- removeDynamicFilter(column) {
794
- delete this.dynamicFilter[column];
795
- return this.updateDynamicFilter();
978
+ filterClick({ event }) {
979
+ if (this.grid.events.filterClick) {
980
+ this.grid.events.filterClick({ event, component: this });
981
+ }
982
+ if (!event.defaultPrevented) {
983
+ this.createFilterFromColumns();
984
+ }
796
985
  }
797
- /**
798
- * Sets new dynamic filter value
799
- * @param filter Dynamic Filter value
800
- * @returns Promise with data collection
801
- */
802
- setDynamicFilter(filter) {
803
- this.dynamicFilter = {};
804
- Object.keys(filter).forEach((column) => {
805
- if (this.isValidDynamicFilterValue(column, filter[column])) {
806
- this.dynamicFilter[column] = filter[column];
807
- }
808
- else {
809
- delete this.dynamicFilter[column];
810
- }
811
- });
812
- return this.updateDynamicFilter();
986
+ createFilterFromColumns() {
987
+ if (!this.filterModal) {
988
+ const filterModalDef = {
989
+ name: `${this.grid.name}-filter-modal`,
990
+ persistent: true,
991
+ children: [
992
+ {
993
+ name: `${this.grid.name}-filter-modal-header`,
994
+ component: 'ZdHeader',
995
+ color: 'transparent',
996
+ padless: true,
997
+ elevation: 0,
998
+ leftSlot: [
999
+ {
1000
+ name: `${this.grid.name}-filter-title`,
1001
+ component: 'ZdText',
1002
+ text: 'FILTER',
1003
+ tag: 'h3',
1004
+ },
1005
+ ],
1006
+ rightSlot: [
1007
+ {
1008
+ name: `${this.grid.name}-filter-close-button`,
1009
+ component: 'ZdModalCloseButton',
1010
+ small: true,
1011
+ modalName: `${this.grid.name}-filter-modal`,
1012
+ },
1013
+ ],
1014
+ },
1015
+ {
1016
+ name: `${this.grid.name}-filter-form`,
1017
+ component: 'ZdForm',
1018
+ cssClass: 'zd-my-4',
1019
+ children: this.getFilterModalComponents(),
1020
+ events: {
1021
+ onMounted: this.loadFilterValues.bind(this),
1022
+ },
1023
+ },
1024
+ {
1025
+ name: `${this.grid.name}-filter-footer`,
1026
+ component: 'ZdFooter',
1027
+ color: 'transparent',
1028
+ padless: true,
1029
+ rightSlot: [
1030
+ {
1031
+ name: `${this.grid.name}-filter-cancelButton`,
1032
+ component: 'ZdButton',
1033
+ label: 'CANCEL',
1034
+ outline: true,
1035
+ events: {
1036
+ click: this.hideFilterModal.bind(this),
1037
+ },
1038
+ },
1039
+ {
1040
+ name: `${this.grid.name}-filter-okButton`,
1041
+ component: 'ZdButton',
1042
+ label: 'OK',
1043
+ events: {
1044
+ click: this.applyFilter.bind(this),
1045
+ },
1046
+ },
1047
+ ],
1048
+ },
1049
+ ],
1050
+ };
1051
+ this.filterModal = common.ModalService.create(filterModalDef);
1052
+ }
1053
+ this.filterModal.show();
813
1054
  }
814
- /**
815
- * Clears Dynamic filter value
816
- * @returns Promise with data collection
817
- */
818
- clearDynamicFilter() {
819
- this.dynamicFilter = {};
820
- return this.updateDynamicFilter();
1055
+ hideFilterModal() {
1056
+ this.filterModal.hide();
821
1057
  }
822
- /**
823
- * Resets page and selected rows and tries to update the url
824
- * @returns Promise with data collection
825
- */
826
- updateDynamicFilter() {
827
- return __awaiter(this, void 0, void 0, function* () {
828
- this.page = this.firstPage;
829
- this.selectedRows = [];
830
- this.visibleSelectedRows = [];
831
- if (this.watchUrl) {
832
- if (this.dynamicFilter && Object.keys(this.dynamicFilter).length) {
833
- core.URL.updateQueryString({
834
- dynamic_filter: btoa(JSON.stringify(this.dynamicFilter)),
835
- });
836
- }
837
- else {
838
- core.URL.updateQueryString({
839
- dynamic_filter: undefined,
840
- });
841
- }
1058
+ getFilterModalComponents() {
1059
+ const filterColumns = [];
1060
+ let columnComponentName;
1061
+ this.grid.columns.forEach((column) => {
1062
+ const filterProps = Array.isArray(column.filterProps) ? column.filterProps : [column.filterProps];
1063
+ if (column.filterable && filterProps && filterProps.length > 0) {
1064
+ filterProps.forEach((filterItem, index) => {
1065
+ const { datasource } = this.grid;
1066
+ if (datasource instanceof TekRestDatasource || datasource instanceof TekMemoryDatasource) {
1067
+ const relation = filterItem.relation || 'AND';
1068
+ const operation = filterItem.operation || 'CONTAINS';
1069
+ columnComponentName = `${this.grid.name}-filter-${relation}-${operation}-${column.name}-${index}`;
1070
+ }
1071
+ else {
1072
+ columnComponentName = `${this.grid.name}-filter-AND-CONTAINS-${column.name}-${index}`;
1073
+ }
1074
+ let newColumnComponent = Object.assign(Object.assign(Object.assign({ label: column.label }, column.componentProps), filterItem), { name: columnComponentName });
1075
+ if (filterItem.helperOptions) {
1076
+ newColumnComponent = this.getHelperValueComponent(newColumnComponent, filterItem.helperOptions, column);
1077
+ }
1078
+ filterColumns.push(newColumnComponent);
1079
+ });
842
1080
  }
843
- return this.get();
844
1081
  });
1082
+ return filterColumns;
845
1083
  }
846
- /**
847
- * Checks if a filter value is valid
848
- * @param value Filter value
849
- * @returns Is valid filter value
850
- */
851
- isValidDynamicFilterValue(column, value) {
852
- return !this.reservedKeys[column]
853
- && value
854
- && value.length > 0
855
- && value.every((filterValue) => this.dynamicFilterOperations[filterValue.operation]
856
- && this.dynamicFilterRelations[filterValue.relation]
857
- && filterValue.value !== '' && filterValue.value !== null);
1084
+ getHelperValueComponent(component, helperValues, column) {
1085
+ return {
1086
+ name: `${component.name}_helperspan`,
1087
+ component: 'ZdTag',
1088
+ tag: 'span',
1089
+ cssClass: 'zd-display-flex',
1090
+ grid: component.grid,
1091
+ children: [
1092
+ Object.assign(Object.assign({}, component), { persistentHint: true, events: {
1093
+ onMounted: this.registerFilterComponentToForm.bind(this),
1094
+ change: this.clearFilterHelperValue.bind(this, column),
1095
+ } }),
1096
+ {
1097
+ name: `${component.name}_helperdropdown`,
1098
+ component: 'ZdDropdown',
1099
+ offsetY: true,
1100
+ activator: {
1101
+ name: `${component.name}_helperbutton`,
1102
+ component: 'ZdButton',
1103
+ iconName: 'magnify',
1104
+ icon: true,
1105
+ small: true,
1106
+ cssClass: `filter-helper-values-button ${component.showLabel !== false ? 'with-label' : ''}`,
1107
+ },
1108
+ children: this.createHelperValueOptions(component, helperValues, column),
1109
+ },
1110
+ ],
1111
+ };
858
1112
  }
859
- /**
860
- * Retrieves request params
861
- */
862
- getRequestParams() {
863
- const requestParams = super.getRequestParams();
864
- const isNotEmptyObj = (obj) => !!(obj && Object.keys(obj).length);
865
- const isValid = this.dynamicFilter && Object.keys(this.dynamicFilter).every((column) => {
866
- const value = this.dynamicFilter[column];
867
- return value && value.length > 0 && this.isValidDynamicFilterValue(column, value);
868
- });
869
- if (isNotEmptyObj(this.dynamicFilter) && isValid) {
870
- requestParams.dynamic_filter = btoa(JSON.stringify(this.dynamicFilter));
871
- }
872
- if (isNotEmptyObj(this.searchJoin)) {
873
- requestParams.search_join = btoa(JSON.stringify(this.searchJoin));
874
- }
875
- return requestParams;
1113
+ createHelperValueOptions(component, helperValues, column) {
1114
+ return helperValues.map((value) => ({
1115
+ name: `${component.name}_helpervalue_${value}`,
1116
+ component: 'ZdText',
1117
+ cssClass: 'filter-helper-values-option',
1118
+ text: TekFilterHelper.getLabel(value),
1119
+ events: {
1120
+ click: this.helperValuesOptionClick.bind(this, component, value, column),
1121
+ },
1122
+ }));
876
1123
  }
877
- clone() {
878
- return Object.assign(Object.assign({}, super.clone()), { dynamicFilter: this.dynamicFilter, searchJoin: this.searchJoin, type: 'tek-rest' });
1124
+ helperValuesOptionClick(component, helperValue, column) {
1125
+ const value = TekFilterHelper.getValue(helperValue, column);
1126
+ const componentObject = core.Metadata.getInstance(component.name);
1127
+ componentObject.value = value;
1128
+ componentObject.hint = TekFilterHelper.getLabel(helperValue);
1129
+ this.setFilterPropsHelperValue(column, component.name, helperValue);
879
1130
  }
880
- }
881
- core.DatasourceFactory.register('tek-rest', TekRestDatasource);
882
-
883
- class TekMemoryDatasource extends core.MemoryDatasource {
884
- /**
885
- * Create new datasource
886
- * @param props Datasource properties
887
- */
888
- constructor(props) {
889
- super(props);
890
- /**
891
- * Dynamic Filter Operations
892
- */
893
- this.dynamicFilterOperations = DynamicFilterOperations;
894
- /**
895
- * Dynamic Filter Relations
896
- */
897
- this.dynamicFilterRelations = DynamicFilterRelations;
898
- /**
899
- * Dynamic Filter applied flag
900
- */
901
- this.dynamicFilterApplied = '';
902
- if (!this.watchUrl) {
903
- this.dynamicFilter = this.getInitValue('dynamicFilter', props.dynamicFilter, {});
904
- this.searchJoin = this.getInitValue('searchJoin', props.searchJoin, {});
1131
+ setFilterPropsHelperValue(column, componentName, helperValue) {
1132
+ if (!Array.isArray(column.filterProps)) {
1133
+ column.filterProps.helperValue = helperValue;
1134
+ }
1135
+ else {
1136
+ column.filterProps.forEach((prop) => {
1137
+ const relationAndOperationAndName = componentName.split(`${this.grid.name}-filter-`)[1];
1138
+ const [relation, operation] = relationAndOperationAndName.split('-');
1139
+ if ((prop.relation || 'AND') === relation && (prop.operation || 'CONTAINS') === operation) {
1140
+ prop.helperValue = helperValue;
1141
+ }
1142
+ });
905
1143
  }
906
- this.createAccessors();
907
- this.get();
908
- }
909
- updateReservedKeys() {
910
- this.reservedKeys.dynamic_filter = true;
911
- this.reservedKeys.search_join = true;
912
- }
913
- updateInternalProperties(datasource = {}) {
914
- if (!this.watchUrl)
915
- return;
916
- this.updateReservedKeys();
917
- super.updateInternalProperties(datasource);
918
- const queryString = core.URL.getParsedQueryStringFromUrl();
919
- this.dynamicFilter = this.getEncodedParam(queryString.dynamic_filter, datasource.dynamicFilter);
920
- this.searchJoin = this.getEncodedParam(queryString.search_join, datasource.searchJoin);
921
1144
  }
922
- getEncodedParam(urlParam, datasourceParam = {}) {
923
- return urlParam ? JSON.parse(atob(urlParam)) : datasourceParam;
1145
+ registerFilterComponentToForm({ component }) {
1146
+ const form = core.Metadata.getInstance(`${this.grid.name}-filter-form`);
1147
+ form.registerInput(component);
924
1148
  }
925
- getQueryStringValues() {
926
- const values = super.getQueryStringValues();
927
- if (this.dynamicFilter && Object.keys(this.dynamicFilter).length) {
928
- values.dynamic_filter = btoa(JSON.stringify(this.dynamicFilter));
929
- }
930
- if (this.searchJoin && Object.keys(this.searchJoin).length) {
931
- values.search_join = btoa(JSON.stringify(this.searchJoin));
932
- }
933
- return values;
1149
+ clearFilterHelperValue(column, { component }) {
1150
+ this.setFilterPropsHelperValue(column, component.name, '');
1151
+ component.hint = '';
934
1152
  }
935
- getUrlQueryString() {
936
- const superQueryString = super.getUrlQueryString();
937
- const query = core.URL.getParsedQueryStringFromUrl();
938
- let dynamicFilterQuerystring = '';
939
- if (query.dynamic_filter) {
940
- dynamicFilterQuerystring = `&${core.URL.getFormattedQueryString({
941
- dynamic_filter: query.dynamic_filter,
942
- })}`;
943
- }
944
- let searchJoinQuerystring = '';
945
- if (query.search_join) {
946
- searchJoinQuerystring = `&${core.URL.getFormattedQueryString({
947
- search_join: query.search_join,
948
- })}`;
1153
+ loadFilterValues({ component }) {
1154
+ const { datasource } = this.grid;
1155
+ if (datasource instanceof TekRestDatasource || datasource instanceof TekMemoryDatasource) {
1156
+ const { dynamicFilter } = datasource;
1157
+ Object.keys(dynamicFilter).forEach((column) => {
1158
+ if (dynamicFilter[column] && dynamicFilter[column].length > 0) {
1159
+ dynamicFilter[column].forEach((filterItem, index) => {
1160
+ const relation = filterItem.relation || 'AND';
1161
+ const operation = filterItem.operation || 'CONTAINS';
1162
+ const compName = `${this.grid.name}-filter-${relation}-${operation}-${column}-${index}`;
1163
+ component.value[compName] = filterItem.value;
1164
+ let helperValue = '';
1165
+ const columnObj = this.grid.getColumn(column);
1166
+ if (columnObj instanceof TekGridColumn) {
1167
+ const { filterProps } = columnObj;
1168
+ if (!Array.isArray(filterProps)) {
1169
+ helperValue = filterProps.helperValue || '';
1170
+ }
1171
+ else {
1172
+ filterProps.forEach((prop) => {
1173
+ if ((prop.relation || 'AND') === relation && (prop.operation || 'CONTAINS') === operation) {
1174
+ helperValue = prop.helperValue || '';
1175
+ }
1176
+ });
1177
+ }
1178
+ const inputObj = core.Metadata.getInstances(compName);
1179
+ if (helperValue && inputObj.length && inputObj[0]) {
1180
+ inputObj[0].hint = TekFilterHelper.getLabel(helperValue);
1181
+ }
1182
+ }
1183
+ });
1184
+ }
1185
+ });
949
1186
  }
950
- return superQueryString + dynamicFilterQuerystring + searchJoinQuerystring;
951
- }
952
- /**
953
- * Adds a new dynamic filter position or replace if exists
954
- * @param column Dynamic Filter column name
955
- * @param value Dynamic Filter value
956
- * @returns Promise with data collection
957
- */
958
- addDynamicFilter(column, value) {
959
- if (this.isValidDynamicFilterValue(column, value)) {
960
- this.dynamicFilter[column] = value;
961
- return this.updateDynamicFilter();
1187
+ else {
1188
+ const { filter } = datasource;
1189
+ Object.keys(filter).forEach((item) => {
1190
+ if (filter[item]) {
1191
+ component.value[`${this.grid.name}-filter-AND-CONTAINS-${item}-0`] = filter[item];
1192
+ }
1193
+ });
962
1194
  }
963
- return this.removeDynamicFilter(column);
964
- }
965
- /**
966
- * Removes a dynamic filter position
967
- * @param column Dynamic Filter column name
968
- * @returns Promise with data collection
969
- */
970
- removeDynamicFilter(column) {
971
- delete this.dynamicFilter[column];
972
- return this.updateDynamicFilter();
973
1195
  }
974
- /**
975
- * Sets new dynamic filter value
976
- * @param filter Dynamic Filter value
977
- * @returns Promise with data collection
978
- */
979
- setDynamicFilter(filter) {
980
- this.dynamicFilter = {};
981
- Object.keys(filter).forEach((column) => {
982
- if (this.isValidDynamicFilterValue(column, filter[column])) {
983
- this.dynamicFilter[column] = filter[column];
1196
+ applyFilter({ event }) {
1197
+ const filterForm = core.Metadata.getInstance(`${this.grid.name}-filter-form`);
1198
+ if (filterForm.validate()) {
1199
+ const { datasource } = this.grid;
1200
+ if (datasource instanceof TekRestDatasource || datasource instanceof TekMemoryDatasource) {
1201
+ const dynamicFilter = {};
1202
+ Object.keys(filterForm.value).forEach((item) => {
1203
+ if (filterForm.value[item] && !(Array.isArray(filterForm.value[item]) && !filterForm.value[item].length)) {
1204
+ const relationAndOperationAndName = item.split(`${this.grid.name}-filter-`)[1];
1205
+ const [relation, operation] = relationAndOperationAndName.split('-');
1206
+ let columnName = relationAndOperationAndName.split(`${relation}-${operation}-`)[1];
1207
+ columnName = columnName.split('-').slice(0, -1).join('-'); // remove index
1208
+ if (!dynamicFilter[columnName]) {
1209
+ dynamicFilter[columnName] = [];
1210
+ }
1211
+ const value = filterForm.value[item];
1212
+ dynamicFilter[columnName].push({
1213
+ relation,
1214
+ operation,
1215
+ value,
1216
+ });
1217
+ }
1218
+ });
1219
+ datasource.dynamicFilter = dynamicFilter;
984
1220
  }
985
1221
  else {
986
- delete this.dynamicFilter[column];
1222
+ Object.keys(filterForm.value).forEach((item) => {
1223
+ let columnName = item.split(`${this.grid.name}-filter-AND-CONTAINS-`)[1];
1224
+ columnName = columnName.split('-').slice(0, -1).join('-'); // remove index
1225
+ if (filterForm.value[item]) {
1226
+ datasource.filter[columnName] = filterForm.value[item];
1227
+ }
1228
+ else {
1229
+ delete datasource.filter[columnName];
1230
+ }
1231
+ });
987
1232
  }
988
- });
989
- return this.updateDynamicFilter();
990
- }
991
- /**
992
- * Clears Dynamic filter value
993
- * @returns Promise with data collection
994
- */
995
- clearDynamicFilter() {
996
- this.dynamicFilter = {};
997
- return this.updateDynamicFilter();
998
- }
999
- /**
1000
- * Resets page and selected rows and tries to update the url
1001
- * @returns Promise with data collection
1002
- */
1003
- updateDynamicFilter() {
1004
- return __awaiter(this, void 0, void 0, function* () {
1005
- this.page = this.firstPage;
1006
- this.selectedRows = [];
1007
- this.visibleSelectedRows = [];
1008
- if (this.watchUrl) {
1009
- if (this.dynamicFilter && Object.keys(this.dynamicFilter).length) {
1010
- core.URL.updateQueryString({
1011
- dynamic_filter: btoa(JSON.stringify(this.dynamicFilter)),
1012
- });
1013
- }
1014
- else {
1015
- core.URL.updateQueryString({
1016
- dynamic_filter: undefined,
1017
- });
1018
- }
1233
+ if (this.grid.events.beforeApplyFilter) {
1234
+ this.grid.events.beforeApplyFilter({ event, component: this });
1019
1235
  }
1020
- return this.get();
1021
- });
1022
- }
1023
- /**
1024
- * Checks if a filter value is valid
1025
- * @param value Filter value
1026
- * @returns Is valid filter value
1027
- */
1028
- isValidDynamicFilterValue(column, value) {
1029
- return !this.reservedKeys[column]
1030
- && value
1031
- && value.length > 0
1032
- && value.every((filterValue) => this.dynamicFilterOperations[filterValue.operation]
1033
- && this.dynamicFilterRelations[filterValue.relation]
1034
- && filterValue.value !== '' && filterValue.value !== null);
1035
- }
1036
- clone() {
1037
- return Object.assign(Object.assign({}, super.clone()), { dynamicFilter: this.dynamicFilter, searchJoin: this.searchJoin, type: 'tek-memory' });
1038
- }
1039
- /**
1040
- * Updates filtered data
1041
- */
1042
- updateFilteredData() {
1043
- super.updateFilteredData();
1044
- if (this.dynamicFilter && Object.keys(this.dynamicFilter).length) {
1045
- this.filteredData = this.filteredData.filter((row) => this.getRowByDynamicFilter(row));
1046
- }
1047
- if (this.searchJoin && Object.keys(this.searchJoin).length) {
1048
- this.filteredData = this.filteredData.filter((row) => this.getRowBySearchJoin(row));
1236
+ if (!event.defaultPrevented) {
1237
+ datasource.get();
1238
+ this.filterModal.hide();
1239
+ }
1240
+ this.grid.changeLayout(event);
1049
1241
  }
1050
1242
  }
1051
- getRowByDynamicFilter(row) {
1052
- let filtered;
1053
- Object.keys(this.dynamicFilter).forEach((key) => {
1054
- const filterItems = this.dynamicFilter[key];
1055
- filterItems.forEach((item) => {
1056
- if (filtered === false && item.relation === 'AND')
1057
- return;
1058
- if (filtered === true && item.relation === 'OR')
1059
- return;
1060
- const columnValue = core.normalize(row[key].toString());
1061
- const value = core.normalize(item.value.toString());
1062
- let range;
1063
- switch (item.operation) {
1064
- case 'CONTAINS':
1065
- filtered = columnValue.indexOf(value) !== -1;
1066
- break;
1067
- case 'NOT_CONTAINS':
1068
- filtered = columnValue.indexOf(value) === -1;
1069
- break;
1070
- case 'EQUALS':
1071
- filtered = columnValue === value;
1072
- break;
1073
- case 'NOT_EQUALS':
1074
- filtered = columnValue !== value;
1075
- break;
1076
- case 'GREATER_THAN':
1077
- filtered = (Number(columnValue) || columnValue) > (Number(value) || value);
1078
- break;
1079
- case 'LESS_THAN':
1080
- filtered = (Number(columnValue) || columnValue) < (Number(value) || value);
1081
- break;
1082
- case 'GREATER_THAN_EQUALS':
1083
- filtered = (Number(columnValue) || columnValue) >= (Number(value) || value);
1084
- break;
1085
- case 'LESS_THAN_EQUALS':
1086
- filtered = (Number(columnValue) || columnValue) <= (Number(value) || value);
1087
- break;
1088
- case 'IN':
1089
- filtered = value.split(';').includes(columnValue);
1090
- break;
1091
- case 'NOT_IN':
1092
- filtered = !value.split(';').includes(columnValue);
1093
- break;
1094
- case 'BETWEEN':
1095
- range = value.split(';');
1096
- filtered = (Number(columnValue) || columnValue) >= (Number(range[0]) || range[0])
1097
- && (Number(columnValue) || columnValue) <= (Number(range[1]) || range[1]);
1098
- break;
1099
- }
1100
- });
1243
+ getFilterRelationsDatasource() {
1244
+ return core.DatasourceFactory.factory({
1245
+ data: this.getFilterOptionsData('relations'),
1246
+ loadAll: true,
1247
+ translate: ['text'],
1101
1248
  });
1102
- return filtered;
1103
1249
  }
1104
- getRowBySearchJoin(row) {
1105
- return Object.keys(this.searchJoin).some((key) => this.searchJoin[key].includes(row[key]));
1250
+ getFilterOperationsDatasource() {
1251
+ return core.DatasourceFactory.factory({
1252
+ data: this.getFilterOptionsData('operations'),
1253
+ loadAll: true,
1254
+ translate: ['text'],
1255
+ });
1106
1256
  }
1107
- }
1108
- core.DatasourceFactory.register('tek-memory', TekMemoryDatasource);
1109
-
1110
- /**
1111
- * Base class for TekGrid column
1112
- */
1113
- class TekGridColumn extends common.GridColumnEditable {
1114
- /* istanbul ignore next */
1115
- /**
1116
- * Creates a new TekGrid Column.
1117
- * @param props TekGrid column properties
1118
- */
1119
- constructor(props, grid) {
1120
- super(props);
1121
- /* filter component props */
1122
- this.filterProps = [];
1123
- /* column can be use to filter */
1124
- this.filterable = true;
1125
- /* column is fixed */
1126
- this.fixed = false;
1127
- /* column is grouped */
1128
- this.groupedValue = false;
1129
- /* Value to show when grouped value is empty */
1130
- this.groupLabelForEmptyValue = '';
1131
- /* column is visible */
1132
- this.isVisibleValue = true;
1133
- /**
1134
- * Defines if the column should store the componentProps datasource.data in memory
1135
- */
1136
- this.storeData = true;
1137
- this.lookup = debounce__default["default"]((lookupColumn) => __awaiter(this, void 0, void 0, function* () {
1138
- var _a, _b;
1139
- let data = [];
1140
- if (this.storeData) {
1141
- data = yield ((_a = this.lookupDatasource) === null || _a === void 0 ? void 0 : _a.get());
1257
+ getFilterOptionsData(prop) {
1258
+ const { datasource } = this.grid;
1259
+ if (datasource instanceof TekRestDatasource || datasource instanceof TekMemoryDatasource) {
1260
+ let options;
1261
+ if (prop === 'relations') {
1262
+ options = Object.keys(datasource.dynamicFilterRelations);
1142
1263
  }
1143
1264
  else {
1144
- const dataToLookup = Array.from(new Set(this.dataToLookup)); // remove duplicates
1145
- this.dataToLookup = [];
1146
- data = yield ((_b = this.lookupDatasource) === null || _b === void 0 ? void 0 : _b.addFilter(lookupColumn, dataToLookup));
1265
+ options = Object.keys(datasource.dynamicFilterOperations);
1147
1266
  }
1148
- data.forEach((row) => {
1149
- this.lookupData[row[lookupColumn]] = row;
1150
- });
1151
- this.lookupDataCount += 1;
1152
- }), 100);
1153
- this.grid = grid;
1154
- this.isVisible = this.getInitValue('isVisible', props.isVisible, this.isVisible);
1155
- this.filterProps = this.getInitValue('filterProps', props.filterProps, this.filterProps);
1156
- this.filterable = this.getInitValue('filterable', props.filterable, this.filterable);
1157
- this.fixed = this.getInitValue('fixed', props.fixed, this.fixed);
1158
- this.grouped = this.getInitValue('grouped', props.grouped, this.grouped);
1159
- this.groupOpened = this.getInitValue('groupOpened', props.groupOpened, this.groupOpened);
1160
- this.aggregation = this.getInitValue('aggregation', props.aggregation, this.aggregation);
1161
- this.groupLabelForEmptyValue = this.getInitValue('groupLabelForEmptyValue', props.groupLabelForEmptyValue, this.groupLabelForEmptyValue);
1162
- this.storeData = this.getInitValue('storeData', props.storeData, this.storeData);
1163
- this.createAccessors();
1164
- }
1165
- getLookupData(lookupColumn, value) {
1166
- const emptyRow = {};
1167
- if (this.lookupData[value]) {
1168
- return this.lookupData[value];
1169
- }
1170
- this.lookupData[value] = emptyRow;
1171
- const dataIndex = this.lookupDatasource.data.findIndex((row) => row[lookupColumn] === value);
1172
- if (dataIndex !== -1) {
1173
- this.lookupData[value] = this.lookupDatasource.data[dataIndex];
1174
- return this.lookupData[value];
1267
+ return options.map((item) => ({
1268
+ text: `TEKGRID_${item}`,
1269
+ value: item,
1270
+ }));
1175
1271
  }
1176
- this.dataToLookup = (this.dataToLookup || []);
1177
- this.dataToLookup.push(value);
1178
- this.lookup(lookupColumn);
1179
- return emptyRow;
1272
+ return [];
1180
1273
  }
1181
- /**
1182
- * Memory search, without changing lookupDatasource
1183
- */
1184
- memorySearch(search) {
1274
+ setSearch(search) {
1185
1275
  return __awaiter(this, void 0, void 0, function* () {
1186
- if (!this.lookupDatasource) {
1187
- throw new Error('Can\'t search in a column that doesn\'t have a datasource');
1188
- }
1189
- let { data } = this.lookupDatasource;
1190
- if (this.storeData) {
1191
- if (!data.length) {
1192
- data = yield this.lookupDatasource.get();
1193
- }
1194
- }
1195
- else {
1196
- // datasource without the lookup filters
1197
- const defaultDs = core.DatasourceFactory.factory(Object.assign(Object.assign({}, this.componentProps.datasource), { lazyLoad: true, loadAll: true }));
1198
- data = yield defaultDs.get();
1276
+ const { datasource } = this.grid;
1277
+ if (datasource instanceof TekRestDatasource || datasource instanceof TekMemoryDatasource) {
1278
+ const lookupColumns = this.grid.columns.filter((column) => !!column.componentProps.datasource);
1279
+ const searchJoin = {};
1280
+ if (search) {
1281
+ const promises = lookupColumns.map((column) => __awaiter(this, void 0, void 0, function* () {
1282
+ const searchData = yield column.memorySearch(search);
1283
+ const lookupId = column.componentProps.datasource.uniqueKey;
1284
+ searchJoin[column.name] = searchData.map((row) => row[lookupId]);
1285
+ }));
1286
+ yield Promise.all(promises);
1287
+ }
1288
+ datasource.searchJoin = searchJoin;
1199
1289
  }
1200
- const { dataText } = this.componentProps;
1201
- const searchIn = Array.isArray(dataText) ? dataText : [dataText];
1202
- // get datasource as memory
1203
- const datasource = core.DatasourceFactory.factory({
1204
- searchIn,
1205
- data,
1206
- type: 'memory',
1207
- loadAll: true,
1208
- });
1209
1290
  return datasource.setSearch(search);
1210
1291
  });
1211
1292
  }
1212
- get grouped() {
1213
- return this.groupedValue;
1214
- }
1215
- set grouped(value) {
1216
- const changed = value !== this.groupedValue;
1217
- this.groupedValue = value;
1218
- if (changed) {
1219
- this.changeGrouping();
1220
- }
1221
- }
1222
- get aggregation() {
1223
- return this.aggregationValue;
1224
- }
1225
- set aggregation(value) {
1226
- const changed = value !== this.aggregationValue;
1227
- this.aggregationValue = value;
1228
- if (changed) {
1229
- this.changeGrouping();
1230
- }
1231
- }
1232
- get isVisible() {
1233
- return this.isVisibleValue && !this.grouped;
1234
- }
1235
- set isVisible(value) {
1236
- this.isVisibleValue = value;
1237
- }
1238
- changeGrouping() {
1239
- // wait for grid.constructor to be fully executed
1240
- setTimeout(() => {
1241
- this.grid.updateGrouping();
1242
- });
1243
- }
1244
- }
1293
+ }
1294
+ core.Messages.add({
1295
+ 'pt-BR': {
1296
+ translation: {
1297
+ TEKGRID_CONTAINS: 'contém',
1298
+ TEKGRID_NOT_CONTAINS: 'não contém',
1299
+ TEKGRID_EQUALS: igual a',
1300
+ TEKGRID_NOT_EQUALS: 'é diferente de',
1301
+ TEKGRID_GREATER_THAN: 'é maior que',
1302
+ TEKGRID_LESS_THAN: 'é menor que',
1303
+ TEKGRID_GREATER_THAN_EQUALS: maior ou igual a',
1304
+ TEKGRID_LESS_THAN_EQUALS: 'é menor ou igual a',
1305
+ TEKGRID_IN: 'um dos valores',
1306
+ TEKGRID_NOT_IN: 'nenhum dos valores',
1307
+ TEKGRID_BETWEEN: 'está entre',
1308
+ TEKGRID_AND: 'e',
1309
+ TEKGRID_OR: 'ou',
1310
+ TEKGRID_ADD: 'Adicionar',
1311
+ TEKGRID_DELETE: 'Excluir',
1312
+ TEKGRID_REFRESH: 'Atualizar',
1313
+ TEKGRID_COLUMNS: 'Colunas',
1314
+ TEKGRID_SAVE: 'Salvar',
1315
+ TEKGRID_CANCEL: 'Cancelar',
1316
+ TEKGRID_APPLY: 'Aplicar',
1317
+ TEKGRID_FILTER: 'Filtro',
1318
+ TEKGRID_MULTIPLE_VALUE_HINT: 'Separe valores usando ";"',
1319
+ TEKGRID_EXPORT: 'Exportar',
1320
+ TEKGRID_EXPORT_AS: 'Exportar como {{ type }}',
1321
+ TEKGRID_COLUMN_VISIBLE: 'Visível',
1322
+ TEKGRID_COLUMN_GROUPED: 'Grupo',
1323
+ TEKGRID_COLUMN_AGGREGATION: 'Totalização',
1324
+ TEKGRID_COLUMN_LABEL: 'Rótulo',
1325
+ TEKGRID_COLUMN_ALIGNMENT: 'Alinhamento',
1326
+ TEKGRID_COLUMN_GROUP_OPENED: 'Aberto (grupo)',
1327
+ TEKGRID_COLUMN_ORDER: 'Ordem',
1328
+ TEKGRID_COLUMN_ORDER_DIRECTION: 'Direção (ordem)',
1329
+ TEKGRID_AGGREGATION_SUM: 'Soma',
1330
+ TEKGRID_AGGREGATION_AVG: 'Média',
1331
+ TEKGRID_AGGREGATION_MAX: 'Máximo',
1332
+ TEKGRID_AGGREGATION_MIN: 'Mínimo',
1333
+ TEKGRID_AGGREGATION_COUNT: 'Contador',
1334
+ TEKGRID_MORE_OPTIONS: 'Mais opções',
1335
+ TEKGRID_COLUMNS_OPTIONS: 'Configuração de colunas',
1336
+ TEKGRID_CLOSE: 'Fechar',
1337
+ TEKGRID_FIXED_COLUMNS: 'Colunas fixadas',
1338
+ TEKGRID_VISIBLE_COLUMNS: 'Colunas visíveis',
1339
+ TEKGRID_GROUPED_COLUMNS: 'Colunas agrupadas',
1340
+ TEKGRID_ORDER: 'Ordem',
1341
+ TEKGRID_OTHER_COLUMNS: 'Outras colunas',
1342
+ TEKGRID_DROP_COLUMNS: 'Arraste colunas aqui',
1343
+ TEKGRID_DETAILS_FOR: 'Detalhes para:',
1344
+ TEKGRID_LEFT: 'Esquerda',
1345
+ TEKGRID_CENTER: 'Centro',
1346
+ TEKGRID_RIGHT: 'Direita',
1347
+ TEKGRID_ASC: 'Crescente',
1348
+ TEKGRID_DESC: 'Decrescente',
1349
+ TEKGRID_SELECT_COLUMN: '(selecione uma ou mais colunas)',
1350
+ TEKGRID_SELECT_ALL: 'Selecionar todas',
1351
+ TEKGRID_HELPERVALUE_TODAY: 'Hoje',
1352
+ TEKGRID_HELPERVALUE_TOMORROW: 'Amanhã',
1353
+ TEKGRID_HELPERVALUE_YESTERDAY: 'Ontem',
1354
+ TEKGRID_HELPERVALUE_LAST_7_DAYS: 'Últimos 7 Dias',
1355
+ TEKGRID_HELPERVALUE_NEXT_7_DAYS: 'Próximos 7 Dias',
1356
+ TEKGRID_HELPERVALUE_CURRENT_WEEK: 'Semana Atual',
1357
+ TEKGRID_HELPERVALUE_CURRENT_MONTH: 'Mês Atual',
1358
+ TEKGRID_HELPERVALUE_CURRENT_YEAR: 'Ano Atual',
1359
+ TEKGRID_WITH_GROUPS: '(Com grupos)',
1360
+ TEKGRID_WITHOUT_GROUPS: '(Sem grupos)',
1361
+ TEKGRID_GRID_MIRROR: '(Espelho do grid)',
1362
+ },
1363
+ },
1364
+ 'en-US': {
1365
+ translation: {
1366
+ TEKGRID_CONTAINS: 'contains',
1367
+ TEKGRID_NOT_CONTAINS: 'does not contain',
1368
+ TEKGRID_EQUALS: 'is equal to',
1369
+ TEKGRID_NOT_EQUALS: 'is differente from',
1370
+ TEKGRID_GREATER_THAN: 'is greater than',
1371
+ TEKGRID_LESS_THAN: 'is less than',
1372
+ TEKGRID_GREATER_THAN_EQUALS: 'is greater or equals to',
1373
+ TEKGRID_LESS_THAN_EQUALS: 'is less or equals to',
1374
+ TEKGRID_IN: 'is in',
1375
+ TEKGRID_NOT_IN: 'is not in',
1376
+ TEKGRID_BETWEEN: 'is between',
1377
+ TEKGRID_AND: 'and',
1378
+ TEKGRID_OR: 'or',
1379
+ TEKGRID_ADD: 'Add',
1380
+ TEKGRID_DELETE: 'Delete',
1381
+ TEKGRID_REFRESH: 'Refresh',
1382
+ TEKGRID_COLUMNS: 'Columns',
1383
+ TEKGRID_SAVE: 'Save',
1384
+ TEKGRID_CANCEL: 'Cancel',
1385
+ TEKGRID_APPLY: 'Apply',
1386
+ TEKGRID_FILTER: 'Filter',
1387
+ TEKGRID_MULTIPLE_VALUE_HINT: 'Separate values using ";"',
1388
+ TEKGRID_EXPORT: 'Export',
1389
+ TEKGRID_EXPORT_AS: 'Export as {{ type }}',
1390
+ TEKGRID_COLUMN_VISIBLE: 'Visible',
1391
+ TEKGRID_COLUMN_GROUPED: 'Grouped',
1392
+ TEKGRID_COLUMN_AGGREGATION: 'Aggregation',
1393
+ TEKGRID_COLUMN_LABEL: 'Label',
1394
+ TEKGRID_COLUMN_ALIGNMENT: 'Alignment',
1395
+ TEKGRID_COLUMN_GROUP_OPENED: 'Opened (group)',
1396
+ TEKGRID_COLUMN_ORDER: 'Order',
1397
+ TEKGRID_COLUMN_ORDER_DIRECTION: 'Direction (order)',
1398
+ TEKGRID_AGGREGATION_SUM: 'Sum',
1399
+ TEKGRID_AGGREGATION_AVG: 'Average',
1400
+ TEKGRID_AGGREGATION_MAX: 'Maximum',
1401
+ TEKGRID_AGGREGATION_MIN: 'Minimum',
1402
+ TEKGRID_AGGREGATION_COUNT: 'Count',
1403
+ TEKGRID_MORE_OPTIONS: 'More options',
1404
+ TEKGRID_COLUMNS_OPTIONS: 'Columns configuration',
1405
+ TEKGRID_CLOSE: 'Close',
1406
+ TEKGRID_FIXED_COLUMNS: 'Fixed columns',
1407
+ TEKGRID_VISIBLE_COLUMNS: 'Visible columns',
1408
+ TEKGRID_GROUPED_COLUMNS: 'Grouped columns',
1409
+ TEKGRID_ORDER: 'Order',
1410
+ TEKGRID_OTHER_COLUMNS: 'Other columns',
1411
+ TEKGRID_DROP_COLUMNS: 'Drop columns here',
1412
+ TEKGRID_DETAILS_FOR: 'Details for:',
1413
+ TEKGRID_LEFT: 'Left',
1414
+ TEKGRID_CENTER: 'Center',
1415
+ TEKGRID_RIGHT: 'Right',
1416
+ TEKGRID_ASC: 'Ascending',
1417
+ TEKGRID_DESC: 'Descending',
1418
+ TEKGRID_SELECT_COLUMN: '(select one or more columns)',
1419
+ TEKGRID_SELECT_ALL: 'Select all',
1420
+ TEKGRID_HELPERVALUE_TODAY: 'Today',
1421
+ TEKGRID_HELPERVALUE_TOMORROW: 'Tomorrow',
1422
+ TEKGRID_HELPERVALUE_YESTERDAY: 'Yesterday',
1423
+ TEKGRID_HELPERVALUE_LAST_7_DAYS: 'Last 7 Days',
1424
+ TEKGRID_HELPERVALUE_NEXT_7_DAYS: 'Next 7 Days',
1425
+ TEKGRID_HELPERVALUE_CURRENT_WEEK: 'Current Week',
1426
+ TEKGRID_HELPERVALUE_CURRENT_MONTH: 'Current Month',
1427
+ TEKGRID_HELPERVALUE_CURRENT_YEAR: 'Current Year',
1428
+ TEKGRID_WITH_GROUPS: '(With groups)',
1429
+ TEKGRID_WITHOUT_GROUPS: '(No groups)',
1430
+ TEKGRID_GRID_MIRROR: '(Grid mirror)',
1431
+ },
1432
+ },
1433
+ 'es-ES': {
1434
+ translation: {
1435
+ TEKGRID_CONTAINS: 'contiene',
1436
+ TEKGRID_NOT_CONTAINS: 'no contiene',
1437
+ TEKGRID_EQUALS: 'igual',
1438
+ TEKGRID_NOT_EQUALS: 'es diferente de',
1439
+ TEKGRID_GREATER_THAN: 'es mayor que',
1440
+ TEKGRID_LESS_THAN: 'es menor que',
1441
+ TEKGRID_GREATER_THAN_EQUALS: 'es mayor o igual que',
1442
+ TEKGRID_LESS_THAN_EQUALS: 'es menor o igual que',
1443
+ TEKGRID_IN: 'uno de los valores',
1444
+ TEKGRID_NOT_IN: 'ninguno de los valores',
1445
+ TEKGRID_BETWEEN: 'está entre',
1446
+ TEKGRID_AND: 'e',
1447
+ TEKGRID_OR: 'o',
1448
+ TEKGRID_ADD: 'Añadir',
1449
+ TEKGRID_DELETE: 'Eliminar',
1450
+ TEKGRID_REFRESH: 'Actualizar',
1451
+ TEKGRID_COLUMNS: 'Colunas',
1452
+ TEKGRID_SAVE: 'Guardar',
1453
+ TEKGRID_CANCEL: 'Cancelar',
1454
+ TEKGRID_APPLY: 'Aplicar',
1455
+ TEKGRID_FILTER: 'Filtro',
1456
+ TEKGRID_MULTIPLE_VALUE_HINT: 'Separe los valores usando ";"',
1457
+ TEKGRID_EXPORT: 'Exportar',
1458
+ TEKGRID_EXPORT_AS: 'Exportar como {{ type }}',
1459
+ TEKGRID_COLUMN_VISIBLE: 'Visible',
1460
+ TEKGRID_COLUMN_GROUPED: 'Grupo',
1461
+ TEKGRID_COLUMN_AGGREGATION: 'Totalización',
1462
+ TEKGRID_COLUMN_LABEL: 'Etiqueta',
1463
+ TEKGRID_COLUMN_ALIGNMENT: 'alineación',
1464
+ TEKGRID_COLUMN_GROUP_OPENED: 'Abierto (grupo)',
1465
+ TEKGRID_COLUMN_ORDER: 'Orden',
1466
+ TEKGRID_COLUMN_ORDER_DIRECTION: 'Dirección (orden)',
1467
+ TEKGRID_AGGREGATION_SUM: 'Suma',
1468
+ TEKGRID_AGGREGATION_AVG: 'Media',
1469
+ TEKGRID_AGGREGATION_MAX: 'Máximo',
1470
+ TEKGRID_AGGREGATION_MIN: 'Mínimo',
1471
+ TEKGRID_AGGREGATION_COUNT: 'Contar',
1472
+ TEKGRID_MORE_OPTIONS: 'Mas opciones',
1473
+ TEKGRID_COLUMNS_OPTIONS: 'Configuración de columna',
1474
+ TEKGRID_CLOSE: 'Cerrar',
1475
+ TEKGRID_FIXED_COLUMNS: 'Columnas fijas',
1476
+ TEKGRID_VISIBLE_COLUMNS: 'Columnas visibles',
1477
+ TEKGRID_GROUPED_COLUMNS: 'Columnas agrupadas',
1478
+ TEKGRID_ORDER: 'Orden',
1479
+ TEKGRID_OTHER_COLUMNS: 'Otras columnas',
1480
+ TEKGRID_DROP_COLUMNS: 'Arrastra columnas aquí',
1481
+ TEKGRID_DETAILS_FOR: 'Detalles para',
1482
+ TEKGRID_LEFT: 'Izquierda',
1483
+ TEKGRID_CENTER: 'Centro',
1484
+ TEKGRID_RIGHT: 'Derecha',
1485
+ TEKGRID_ASC: 'Creciente',
1486
+ TEKGRID_DESC: 'Decreciente',
1487
+ TEKGRID_SELECT_COLUMN: '(seleccione una o más columnas)',
1488
+ TEKGRID_SELECT_ALL: 'Seleccionar todas',
1489
+ TEKGRID_HELPERVALUE_TODAY: 'Hoy',
1490
+ TEKGRID_HELPERVALUE_TOMORROW: 'Mañana',
1491
+ TEKGRID_HELPERVALUE_YESTERDAY: 'Ayer',
1492
+ TEKGRID_HELPERVALUE_LAST_7_DAYS: 'Últimos 7 días',
1493
+ TEKGRID_HELPERVALUE_NEXT_7_DAYS: 'Próximos 7 días',
1494
+ TEKGRID_HELPERVALUE_CURRENT_WEEK: 'Semana actual',
1495
+ TEKGRID_HELPERVALUE_CURRENT_MONTH: 'Mes actual',
1496
+ TEKGRID_HELPERVALUE_CURRENT_YEAR: 'Año actual',
1497
+ TEKGRID_WITH_GROUPS: '(Con grupos)',
1498
+ TEKGRID_WITHOUT_GROUPS: '(No grupos)',
1499
+ TEKGRID_GRID_MIRROR: '(Espejo de grid)',
1500
+ },
1501
+ },
1502
+ });
1245
1503
 
1246
- class TekGridController {
1504
+ class GridController {
1247
1505
  constructor(grid) {
1248
1506
  this.grid = grid;
1249
1507
  }
@@ -1292,572 +1550,713 @@
1292
1550
  }
1293
1551
  }
1294
1552
 
1295
- /* TekGrid Class */
1296
- class TekGrid extends common.GridEditable {
1553
+ const DynamicFilterOperations = {
1554
+ CONTAINS: true,
1555
+ NOT_CONTAINS: true,
1556
+ EQUALS: true,
1557
+ NOT_EQUALS: true,
1558
+ GREATER_THAN: true,
1559
+ LESS_THAN: true,
1560
+ GREATER_THAN_EQUALS: true,
1561
+ LESS_THAN_EQUALS: true,
1562
+ IN: true,
1563
+ NOT_IN: true,
1564
+ BETWEEN: true,
1565
+ };
1566
+ const DynamicFilterRelations = {
1567
+ AND: true,
1568
+ OR: true,
1569
+ };
1570
+
1571
+ class TekRestDatasource extends core.RestDatasource {
1297
1572
  /**
1298
- * TekGrid class constructor
1299
- * @param props TekGrid properties
1300
- */
1573
+ * Create new datasource
1574
+ * @param props Datasource properties
1575
+ */
1301
1576
  constructor(props) {
1302
- var _a;
1303
- super(Object.assign(Object.assign({}, props), { datasource: Object.assign(Object.assign({}, props.datasource), { lazyLoad: true }) }));
1304
- /* Grid Title */
1305
- this.title = '';
1306
- /* Show Add button */
1307
- this.addButton = false;
1308
- /* Show Delete button */
1309
- this.deleteButton = 'none';
1310
- /* Show Delete button */
1311
- this.actions = [];
1312
- /* Show Filter button */
1313
- this.filterButton = false;
1314
- /* Show Column Filter button */
1315
- this.columnFilterButton = false;
1316
- /* Show Columns button */
1317
- this.columnsButton = false;
1318
- /* Columns to be ignored on columns button */
1319
- this.columnsButtonIgnore = [];
1320
- /**
1321
- * Enables column dragging
1322
- * @public
1323
- */
1324
- this.dragColumns = true;
1325
- /**
1326
- * Enables column resizing
1327
- * @public
1328
- */
1329
- this.resizeColumns = true;
1330
- /**
1331
- * Enables layout saving
1332
- * @public
1333
- */
1334
- this.showLayoutOptions = true;
1335
- /**
1336
- * Show export button
1337
- */
1338
- this.showExport = false;
1339
- /**
1340
- * Show refresh button
1341
- */
1342
- this.showReload = true;
1577
+ super(Object.assign(Object.assign({}, props), { lazyLoad: true }));
1343
1578
  /**
1344
- * Export config
1579
+ * Dynamic Filter Operations
1345
1580
  */
1346
- this.exportConfig = [
1347
- {
1348
- type: 'pdf',
1349
- label: core.I18n.translate('TEKGRID_EXPORT_AS', { type: 'PDF' }),
1350
- },
1351
- {
1352
- type: 'xls',
1353
- label: core.I18n.translate('TEKGRID_EXPORT_AS', { type: 'XLS' }),
1354
- },
1355
- {
1356
- type: 'csv',
1357
- label: core.I18n.translate('TEKGRID_EXPORT_AS', { type: 'CSV' }),
1358
- },
1359
- ];
1360
- this.exportConfigButtons = [];
1581
+ this.dynamicFilterOperations = DynamicFilterOperations;
1361
1582
  /**
1362
- * Groups should be opened by default after building
1583
+ * Dynamic Filter Relations
1363
1584
  */
1364
- this.groupsOpened = false;
1585
+ this.dynamicFilterRelations = DynamicFilterRelations;
1365
1586
  /**
1366
- * Show Total summary
1587
+ * Dynamic Filter applied flag
1367
1588
  */
1368
- this.showSummaryTotal = true;
1369
- this.groupColumnNames = [];
1370
- this.summaryColumns = [];
1371
- this.groupColumns = [];
1372
- this.groupedData = [];
1373
- this.toolbarSlotProps = false;
1374
- this.filterRelationsDatasource = core.DatasourceFactory.factory({
1375
- data: this.getFilterOptionsData('relations'),
1376
- loadAll: true,
1377
- translate: ['text'],
1378
- });
1379
- this.filterOperationsDatasource = core.DatasourceFactory.factory({
1380
- data: this.getFilterOptionsData('operations'),
1381
- loadAll: true,
1382
- translate: ['text'],
1383
- });
1384
- this.groups = [];
1385
- this.summary = {};
1386
- this.updateGrouping = debounce__default["default"]((lazyLoad = false) => {
1387
- this.updateGroupedData(lazyLoad);
1388
- }, 500);
1389
- this.title = this.getInitValue('title', props.title, this.title);
1390
- this.addButton = this.getInitValue('addButton', props.addButton, this.addButton);
1391
- this.deleteButton = this.getInitValue('deleteButton', props.deleteButton, this.deleteButton);
1392
- this.filterButton = this.getInitValue('filterButton', props.filterButton, this.filterButton);
1393
- this.columnFilterButton = this.getInitValue('columnFilterButton', props.columnFilterButton, this.columnFilterButton);
1394
- this.columnsButton = this.getInitValue('columnsButton', props.columnsButton, this.columnsButton);
1395
- this.columnsButtonIgnore = this.getInitValue('columnsButtonIgnore', props.columnsButtonIgnore, this.columnsButtonIgnore);
1396
- this.dragColumns = this.getInitValue('dragColumns', props.dragColumns, this.dragColumns);
1397
- this.resizeColumns = this.getInitValue('resizeColumns', props.resizeColumns, this.resizeColumns);
1398
- this.showLayoutOptions = this.getInitValue('showLayoutOptions', props.showLayoutOptions, this.showLayoutOptions);
1399
- this.showExport = this.getInitValue('showExport', props.showExport, this.showExport);
1400
- this.showReload = this.getInitValue('showReload', props.showReload, this.showReload);
1401
- this.exportConfig = this.getInitValue('exportConfig', props.exportConfig, this.exportConfig);
1402
- this.exportActions = props.exportActions || this.exportActions;
1403
- this.groupsOpened = this.getInitValue('groupsOpened', props.groupsOpened, this.groupsOpened);
1404
- this.showSummaryTotal = this.getInitValue('showSummaryTotal', props.showSummaryTotal, this.showSummaryTotal);
1405
- this.actions = props.actions || this.actions;
1406
- this.toolbarSlotProps = props.toolbarSlot !== undefined;
1407
- if (this.deleteButton === 'selection') {
1408
- this.selectable = true;
1589
+ this.dynamicFilterApplied = '';
1590
+ if (!this.watchUrl) {
1591
+ this.dynamicFilter = this.getInitValue('dynamicFilter', props.dynamicFilter, {});
1592
+ this.searchJoin = this.getInitValue('searchJoin', props.searchJoin, {});
1409
1593
  }
1594
+ this.lazyLoad = this.getInitValue('lazyLoad', props.lazyLoad, this.lazyLoad);
1410
1595
  this.createAccessors();
1411
- this.exportConfigButtons = this.getExportConfigButtons();
1412
- this.initGrouping((_a = props.datasource) === null || _a === void 0 ? void 0 : _a.lazyLoad);
1596
+ if (!this.lazyLoad) {
1597
+ this.get();
1598
+ }
1413
1599
  }
1414
- getExportConfigButtons() {
1415
- return this.exportConfig.map((config) => {
1416
- const { type, label, portrait = true, iconName, } = config;
1417
- const orientation = portrait ? 'portrait' : 'landscape';
1418
- return {
1419
- label,
1420
- iconName,
1421
- name: `${this.name}_export_${type}_${orientation}`,
1422
- component: 'ZdButton',
1423
- flat: true,
1424
- events: {
1425
- click: () => this.getReport(type, portrait),
1426
- },
1427
- };
1600
+ updateReservedKeys() {
1601
+ this.reservedKeys.dynamic_filter = true;
1602
+ this.reservedKeys.search_join = true;
1603
+ }
1604
+ updateInternalProperties(datasource = {}) {
1605
+ if (!this.watchUrl)
1606
+ return;
1607
+ this.updateReservedKeys();
1608
+ super.updateInternalProperties(datasource);
1609
+ const queryString = core.URL.getParsedQueryStringFromUrl();
1610
+ this.dynamicFilter = this.getEncodedParam(queryString.dynamic_filter, datasource.dynamicFilter);
1611
+ this.searchJoin = this.getEncodedParam(queryString.search_join, datasource.searchJoin);
1612
+ }
1613
+ getEncodedParam(urlParam, datasourceParam = {}) {
1614
+ return urlParam ? JSON.parse(atob(urlParam)) : datasourceParam;
1615
+ }
1616
+ getQueryStringValues() {
1617
+ const values = super.getQueryStringValues();
1618
+ if (this.dynamicFilter && Object.keys(this.dynamicFilter).length) {
1619
+ values.dynamic_filter = btoa(JSON.stringify(this.dynamicFilter));
1620
+ }
1621
+ if (this.searchJoin && Object.keys(this.searchJoin).length) {
1622
+ values.search_join = btoa(JSON.stringify(this.searchJoin));
1623
+ }
1624
+ return values;
1625
+ }
1626
+ getUrlQueryString() {
1627
+ const superQueryString = super.getUrlQueryString();
1628
+ const query = core.URL.getParsedQueryStringFromUrl();
1629
+ let dynamicFilterQuerystring = '';
1630
+ if (query.dynamic_filter) {
1631
+ dynamicFilterQuerystring = `&${core.URL.getFormattedQueryString({
1632
+ dynamic_filter: query.dynamic_filter,
1633
+ })}`;
1634
+ }
1635
+ let searchJoinQuerystring = '';
1636
+ if (query.search_join) {
1637
+ searchJoinQuerystring = `&${core.URL.getFormattedQueryString({
1638
+ search_join: query.search_join,
1639
+ })}`;
1640
+ }
1641
+ return superQueryString + dynamicFilterQuerystring + searchJoinQuerystring;
1642
+ }
1643
+ /**
1644
+ * Adds a new dynamic filter position or replace if exists
1645
+ * @param column Dynamic Filter column name
1646
+ * @param value Dynamic Filter value
1647
+ * @returns Promise with data collection
1648
+ */
1649
+ addDynamicFilter(column, value) {
1650
+ if (this.isValidDynamicFilterValue(column, value)) {
1651
+ this.dynamicFilter[column] = value;
1652
+ return this.updateDynamicFilter();
1653
+ }
1654
+ return this.removeDynamicFilter(column);
1655
+ }
1656
+ /**
1657
+ * Removes a dynamic filter position
1658
+ * @param column Dynamic Filter column name
1659
+ * @returns Promise with data collection
1660
+ */
1661
+ removeDynamicFilter(column) {
1662
+ delete this.dynamicFilter[column];
1663
+ return this.updateDynamicFilter();
1664
+ }
1665
+ /**
1666
+ * Sets new dynamic filter value
1667
+ * @param filter Dynamic Filter value
1668
+ * @returns Promise with data collection
1669
+ */
1670
+ setDynamicFilter(filter) {
1671
+ this.dynamicFilter = {};
1672
+ Object.keys(filter).forEach((column) => {
1673
+ if (this.isValidDynamicFilterValue(column, filter[column])) {
1674
+ this.dynamicFilter[column] = filter[column];
1675
+ }
1676
+ else {
1677
+ delete this.dynamicFilter[column];
1678
+ }
1428
1679
  });
1680
+ return this.updateDynamicFilter();
1429
1681
  }
1430
- onCreated() {
1431
- super.onCreated();
1432
- core.Loader.addController(`TekGridController_${this.componentId}`, new TekGridController(this));
1433
- if (!this.toolbarSlotProps)
1434
- this.createToolbarProps();
1435
- this.navigationKeyMapping.left = {
1436
- event: this.navigateLeft.bind(this),
1437
- stop: true,
1438
- active: true,
1439
- };
1440
- this.navigationKeyMapping.right = {
1441
- event: this.navigateRight.bind(this),
1442
- stop: true,
1443
- active: true,
1444
- };
1682
+ /**
1683
+ * Clears Dynamic filter value
1684
+ * @returns Promise with data collection
1685
+ */
1686
+ clearDynamicFilter() {
1687
+ this.dynamicFilter = {};
1688
+ return this.updateDynamicFilter();
1445
1689
  }
1446
1690
  /**
1447
- * Get Grid columns objects
1448
- * @param columns Grid columns parameter
1691
+ * Resets page and selected rows and tries to update the url
1692
+ * @returns Promise with data collection
1449
1693
  */
1450
- getColumns(columns) {
1451
- return columns.map((column) => new TekGridColumn(column, this));
1694
+ updateDynamicFilter() {
1695
+ return __awaiter(this, void 0, void 0, function* () {
1696
+ this.page = this.firstPage;
1697
+ this.selectedRows = [];
1698
+ this.visibleSelectedRows = [];
1699
+ if (this.watchUrl) {
1700
+ if (this.dynamicFilter && Object.keys(this.dynamicFilter).length) {
1701
+ core.URL.updateQueryString({
1702
+ dynamic_filter: btoa(JSON.stringify(this.dynamicFilter)),
1703
+ });
1704
+ }
1705
+ else {
1706
+ core.URL.updateQueryString({
1707
+ dynamic_filter: undefined,
1708
+ });
1709
+ }
1710
+ }
1711
+ return this.get();
1712
+ });
1452
1713
  }
1453
- createToolbarProps() {
1454
- this.toolbarSlot = [
1455
- {
1456
- name: `${this.name}_gridTitle`,
1457
- component: 'ZdText',
1458
- cssClass: 'toolbar-title',
1459
- tag: 'h2',
1460
- text: this.title,
1461
- title: this.title,
1462
- },
1463
- {
1464
- name: `${this.name}_spacer`,
1465
- component: 'VSpacer',
1466
- },
1467
- {
1468
- name: `${this.name}_notEditingSpan`,
1469
- component: 'ZdTag',
1470
- tag: 'span',
1471
- cssStyle: 'display: flex',
1472
- isVisible: `{{TekGridController_${this.componentId}.isNotEditing}}`,
1473
- children: [
1474
- {
1475
- name: `${this.name}_add_tooltip`,
1476
- component: 'ZdTooltip',
1477
- label: 'TEKGRID_ADD',
1478
- bottom: true,
1479
- children: [
1480
- {
1481
- name: `${this.name}_addButton`,
1482
- component: 'ZdButton',
1483
- icon: true,
1484
- iconName: 'add',
1485
- isVisible: `{{TekGridController_${this.componentId}.showAddButton}}`,
1486
- events: {
1487
- click: this.addButtonClick.bind(this),
1488
- },
1489
- },
1490
- ],
1491
- },
1492
- {
1493
- name: `${this.name}_delete_tooltip`,
1494
- component: 'ZdTooltip',
1495
- label: 'TEKGRID_DELETE',
1496
- bottom: true,
1497
- children: [
1498
- {
1499
- name: `${this.name}_deleteButton`,
1500
- component: 'ZdButton',
1501
- icon: true,
1502
- iconName: 'delete',
1503
- isVisible: `{{TekGridController_${this.componentId}.showDeleteButton}}`,
1504
- disabled: `{{TekGridController_${this.componentId}.disableDeleteButton}}`,
1505
- events: {
1506
- click: this.deleteButtonClick.bind(this),
1507
- },
1508
- },
1509
- ],
1510
- },
1511
- {
1512
- name: `${this.name}_divider1`,
1513
- component: 'ZdDivider',
1514
- cssClass: 'toolbar-divider',
1515
- vertical: true,
1516
- isVisible: `{{TekGridController_${this.componentId}.showFirstDivider}}`,
1517
- },
1518
- {
1519
- name: `${this.name}_refresh_tooltip`,
1520
- component: 'ZdTooltip',
1521
- label: 'TEKGRID_REFRESH',
1522
- bottom: true,
1523
- children: [
1524
- {
1525
- name: `${this.name}_refreshButton`,
1526
- component: 'ZdButton',
1527
- icon: true,
1528
- iconName: 'refresh',
1529
- isVisible: this.showReload,
1530
- events: {
1531
- click: this.reloadGrid.bind(this),
1532
- },
1533
- },
1534
- ],
1535
- },
1536
- {
1537
- name: `${this.name}_divider2`,
1538
- component: 'ZdDivider',
1539
- cssClass: 'toolbar-divider',
1540
- vertical: true,
1541
- isVisible: `{{TekGridController_${this.componentId}.showLayoutOptions}`,
1542
- },
1543
- {
1544
- name: `${this.name}_columns_button_tooltip`,
1545
- component: 'ZdTooltip',
1546
- label: 'TEKGRID_COLUMNS',
1547
- bottom: true,
1548
- children: [
1549
- {
1550
- name: `${this.name}_columnsButton`,
1551
- component: 'TekGridColumnsButton',
1552
- isVisible: `{{TekGridController_${this.componentId}.showColumnsButton}}`,
1553
- iterableComponentName: this.name,
1554
- ignoreColumns: `{{TekGridController_${this.componentId}.columnsButtonIgnore}}`,
1555
- },
1556
- ],
1557
- },
1558
- {
1559
- name: `${this.name}_layout_options`,
1560
- component: 'TekGridLayoutOptions',
1561
- isVisible: `{{TekGridController_${this.componentId}.showLayoutOptions}}`,
1562
- },
1563
- {
1564
- name: `${this.name}_dividerActions`,
1565
- component: 'ZdDivider',
1566
- cssClass: 'toolbar-divider',
1567
- vertical: true,
1568
- isVisible: `{{TekGridController_${this.componentId}.showActionAndExportButton}}`,
1569
- },
1570
- {
1571
- name: `${this.name}_export_dropdown`,
1572
- component: 'ZdDropdown',
1573
- cssClass: 'tekgrid-actions-dropdown',
1574
- offsetY: true,
1575
- activator: {
1576
- name: `${this.name}_exportButton`,
1577
- component: 'ZdButton',
1578
- icon: true,
1579
- iconName: 'fileDownload',
1580
- isVisible: `{{TekGridController_${this.componentId}.showExportButton}}`,
1581
- },
1582
- children: this.exportActions || this.exportConfigButtons,
1583
- },
1584
- {
1585
- name: `${this.name}_actions_dropdown`,
1586
- component: 'ZdDropdown',
1587
- cssClass: 'tekgrid-actions-dropdown',
1588
- offsetY: true,
1589
- activator: {
1590
- name: `${this.name}_actionsButton`,
1591
- component: 'ZdButton',
1592
- icon: true,
1593
- iconName: 'more',
1594
- isVisible: `{{TekGridController_${this.componentId}.showActionsButton}}`,
1595
- },
1596
- children: this.actions,
1597
- },
1598
- {
1599
- name: `${this.name}_divider3`,
1600
- component: 'ZdDivider',
1601
- cssClass: 'toolbar-divider',
1602
- vertical: true,
1603
- },
1604
- ],
1605
- },
1606
- {
1607
- name: `${this.name}_saveButton`,
1608
- component: 'ZdButton',
1609
- label: 'TEKGRID_SAVE',
1610
- isVisible: `{{TekGridController_${this.componentId}.isEditing}}`,
1611
- small: true,
1612
- events: {
1613
- click: this.saveChanges.bind(this),
1614
- },
1615
- },
1616
- {
1617
- name: `${this.name}_cancelButton`,
1618
- component: 'ZdButton',
1619
- label: 'TEKGRID_CANCEL',
1620
- outline: true,
1621
- cssClass: 'zd-mx-2',
1622
- isVisible: `{{TekGridController_${this.componentId}.isEditing}}`,
1623
- small: true,
1624
- events: {
1625
- click: this.cancelChanges.bind(this),
1626
- },
1627
- },
1628
- {
1629
- name: `${this.name}_gridSearch`,
1630
- component: 'ZdSearch',
1631
- },
1632
- {
1633
- name: `${this.name}_filter_tooltip`,
1634
- component: 'ZdTooltip',
1635
- label: 'TEKGRID_FILTER',
1636
- bottom: true,
1637
- children: [
1638
- {
1639
- name: `${this.name}_filterButton`,
1640
- component: 'ZdButton',
1641
- icon: true,
1642
- iconName: 'filter',
1643
- isVisible: `{{TekGridController_${this.componentId}.showFilterButton}}`,
1644
- events: {
1645
- click: this.filterClick.bind(this),
1646
- },
1647
- },
1648
- ],
1649
- },
1650
- ];
1714
+ /**
1715
+ * Checks if a filter value is valid
1716
+ * @param value Filter value
1717
+ * @returns Is valid filter value
1718
+ */
1719
+ isValidDynamicFilterValue(column, value) {
1720
+ return !this.reservedKeys[column]
1721
+ && value
1722
+ && value.length > 0
1723
+ && value.every((filterValue) => this.dynamicFilterOperations[filterValue.operation]
1724
+ && this.dynamicFilterRelations[filterValue.relation]
1725
+ && filterValue.value !== '' && filterValue.value !== null);
1651
1726
  }
1652
- saveChanges({ event }) {
1653
- if (this.events.beforeSave) {
1654
- this.events.beforeSave({ component: this, event });
1727
+ /**
1728
+ * Retrieves request params
1729
+ */
1730
+ getRequestParams() {
1731
+ const requestParams = super.getRequestParams();
1732
+ const isNotEmptyObj = (obj) => !!(obj && Object.keys(obj).length);
1733
+ const isValid = this.dynamicFilter && Object.keys(this.dynamicFilter).every((column) => {
1734
+ const value = this.dynamicFilter[column];
1735
+ return value && value.length > 0 && this.isValidDynamicFilterValue(column, value);
1736
+ });
1737
+ if (isNotEmptyObj(this.dynamicFilter) && isValid) {
1738
+ requestParams.dynamic_filter = btoa(JSON.stringify(this.dynamicFilter));
1655
1739
  }
1656
- if (!event.defaultPrevented) {
1657
- this.saveEditedRows();
1658
- if (this.events.afterSave) {
1659
- this.events.afterSave({ component: this });
1740
+ if (isNotEmptyObj(this.searchJoin)) {
1741
+ requestParams.search_join = btoa(JSON.stringify(this.searchJoin));
1742
+ }
1743
+ return requestParams;
1744
+ }
1745
+ clone() {
1746
+ return Object.assign(Object.assign({}, super.clone()), { dynamicFilter: this.dynamicFilter, searchJoin: this.searchJoin, type: 'tek-rest' });
1747
+ }
1748
+ }
1749
+ core.DatasourceFactory.register('tek-rest', TekRestDatasource);
1750
+
1751
+ class TekMemoryDatasource extends core.MemoryDatasource {
1752
+ /**
1753
+ * Create new datasource
1754
+ * @param props Datasource properties
1755
+ */
1756
+ constructor(props) {
1757
+ super(props);
1758
+ /**
1759
+ * Dynamic Filter Operations
1760
+ */
1761
+ this.dynamicFilterOperations = DynamicFilterOperations;
1762
+ /**
1763
+ * Dynamic Filter Relations
1764
+ */
1765
+ this.dynamicFilterRelations = DynamicFilterRelations;
1766
+ /**
1767
+ * Dynamic Filter applied flag
1768
+ */
1769
+ this.dynamicFilterApplied = '';
1770
+ if (!this.watchUrl) {
1771
+ this.dynamicFilter = this.getInitValue('dynamicFilter', props.dynamicFilter, {});
1772
+ this.searchJoin = this.getInitValue('searchJoin', props.searchJoin, {});
1773
+ }
1774
+ this.createAccessors();
1775
+ this.get();
1776
+ }
1777
+ updateReservedKeys() {
1778
+ this.reservedKeys.dynamic_filter = true;
1779
+ this.reservedKeys.search_join = true;
1780
+ }
1781
+ updateInternalProperties(datasource = {}) {
1782
+ if (!this.watchUrl)
1783
+ return;
1784
+ this.updateReservedKeys();
1785
+ super.updateInternalProperties(datasource);
1786
+ const queryString = core.URL.getParsedQueryStringFromUrl();
1787
+ this.dynamicFilter = this.getEncodedParam(queryString.dynamic_filter, datasource.dynamicFilter);
1788
+ this.searchJoin = this.getEncodedParam(queryString.search_join, datasource.searchJoin);
1789
+ }
1790
+ getEncodedParam(urlParam, datasourceParam = {}) {
1791
+ return urlParam ? JSON.parse(atob(urlParam)) : datasourceParam;
1792
+ }
1793
+ getQueryStringValues() {
1794
+ const values = super.getQueryStringValues();
1795
+ if (this.dynamicFilter && Object.keys(this.dynamicFilter).length) {
1796
+ values.dynamic_filter = btoa(JSON.stringify(this.dynamicFilter));
1797
+ }
1798
+ if (this.searchJoin && Object.keys(this.searchJoin).length) {
1799
+ values.search_join = btoa(JSON.stringify(this.searchJoin));
1800
+ }
1801
+ return values;
1802
+ }
1803
+ getUrlQueryString() {
1804
+ const superQueryString = super.getUrlQueryString();
1805
+ const query = core.URL.getParsedQueryStringFromUrl();
1806
+ let dynamicFilterQuerystring = '';
1807
+ if (query.dynamic_filter) {
1808
+ dynamicFilterQuerystring = `&${core.URL.getFormattedQueryString({
1809
+ dynamic_filter: query.dynamic_filter,
1810
+ })}`;
1811
+ }
1812
+ let searchJoinQuerystring = '';
1813
+ if (query.search_join) {
1814
+ searchJoinQuerystring = `&${core.URL.getFormattedQueryString({
1815
+ search_join: query.search_join,
1816
+ })}`;
1817
+ }
1818
+ return superQueryString + dynamicFilterQuerystring + searchJoinQuerystring;
1819
+ }
1820
+ /**
1821
+ * Adds a new dynamic filter position or replace if exists
1822
+ * @param column Dynamic Filter column name
1823
+ * @param value Dynamic Filter value
1824
+ * @returns Promise with data collection
1825
+ */
1826
+ addDynamicFilter(column, value) {
1827
+ if (this.isValidDynamicFilterValue(column, value)) {
1828
+ this.dynamicFilter[column] = value;
1829
+ return this.updateDynamicFilter();
1830
+ }
1831
+ return this.removeDynamicFilter(column);
1832
+ }
1833
+ /**
1834
+ * Removes a dynamic filter position
1835
+ * @param column Dynamic Filter column name
1836
+ * @returns Promise with data collection
1837
+ */
1838
+ removeDynamicFilter(column) {
1839
+ delete this.dynamicFilter[column];
1840
+ return this.updateDynamicFilter();
1841
+ }
1842
+ /**
1843
+ * Sets new dynamic filter value
1844
+ * @param filter Dynamic Filter value
1845
+ * @returns Promise with data collection
1846
+ */
1847
+ setDynamicFilter(filter) {
1848
+ this.dynamicFilter = {};
1849
+ Object.keys(filter).forEach((column) => {
1850
+ if (this.isValidDynamicFilterValue(column, filter[column])) {
1851
+ this.dynamicFilter[column] = filter[column];
1660
1852
  }
1661
- }
1662
- }
1663
- cancelChanges({ event }) {
1664
- if (this.events.beforeCancel) {
1665
- this.events.beforeCancel({ component: this, event });
1666
- }
1667
- if (!event.defaultPrevented) {
1668
- this.cancelEditedRows();
1669
- if (this.events.afterCancel) {
1670
- this.events.afterCancel({ component: this });
1853
+ else {
1854
+ delete this.dynamicFilter[column];
1671
1855
  }
1672
- }
1856
+ });
1857
+ return this.updateDynamicFilter();
1673
1858
  }
1674
- addButtonClick({ event }) {
1675
- if (this.events.addClick) {
1676
- this.events.addClick({ component: this, event });
1677
- }
1859
+ /**
1860
+ * Clears Dynamic filter value
1861
+ * @returns Promise with data collection
1862
+ */
1863
+ clearDynamicFilter() {
1864
+ this.dynamicFilter = {};
1865
+ return this.updateDynamicFilter();
1678
1866
  }
1679
- deleteButtonClick({ event }) {
1680
- if (this.events.beforeDelete) {
1681
- this.events.beforeDelete({ component: this, event });
1682
- }
1683
- if (!event.defaultPrevented) {
1684
- this.deleteRows();
1685
- if (this.events.afterDelete) {
1686
- this.events.afterDelete({ component: this });
1867
+ /**
1868
+ * Resets page and selected rows and tries to update the url
1869
+ * @returns Promise with data collection
1870
+ */
1871
+ updateDynamicFilter() {
1872
+ return __awaiter(this, void 0, void 0, function* () {
1873
+ this.page = this.firstPage;
1874
+ this.selectedRows = [];
1875
+ this.visibleSelectedRows = [];
1876
+ if (this.watchUrl) {
1877
+ if (this.dynamicFilter && Object.keys(this.dynamicFilter).length) {
1878
+ core.URL.updateQueryString({
1879
+ dynamic_filter: btoa(JSON.stringify(this.dynamicFilter)),
1880
+ });
1881
+ }
1882
+ else {
1883
+ core.URL.updateQueryString({
1884
+ dynamic_filter: undefined,
1885
+ });
1886
+ }
1687
1887
  }
1688
- }
1888
+ return this.get();
1889
+ });
1689
1890
  }
1690
- reloadGrid() {
1691
- this.reload();
1891
+ /**
1892
+ * Checks if a filter value is valid
1893
+ * @param value Filter value
1894
+ * @returns Is valid filter value
1895
+ */
1896
+ isValidDynamicFilterValue(column, value) {
1897
+ return !this.reservedKeys[column]
1898
+ && value
1899
+ && value.length > 0
1900
+ && value.every((filterValue) => this.dynamicFilterOperations[filterValue.operation]
1901
+ && this.dynamicFilterRelations[filterValue.relation]
1902
+ && filterValue.value !== '' && filterValue.value !== null);
1692
1903
  }
1693
- filterClick({ event }) {
1694
- if (this.events.filterClick) {
1695
- this.events.filterClick({ event, component: this });
1696
- }
1697
- if (!event.defaultPrevented) {
1698
- this.createFilterFromColumns();
1699
- }
1904
+ clone() {
1905
+ return Object.assign(Object.assign({}, super.clone()), { dynamicFilter: this.dynamicFilter, searchJoin: this.searchJoin, type: 'tek-memory' });
1700
1906
  }
1701
- createFilterFromColumns() {
1702
- if (!this.filterModal) {
1703
- const filterModalDef = {
1704
- name: `${this.name}-filter-modal`,
1705
- persistent: true,
1706
- children: [
1707
- {
1708
- name: `${this.name}-filter-modal-header`,
1709
- component: 'ZdHeader',
1710
- color: 'transparent',
1711
- padless: true,
1712
- elevation: 0,
1713
- leftSlot: [
1714
- {
1715
- name: `${this.name}-filter-title`,
1716
- component: 'ZdText',
1717
- text: 'FILTER',
1718
- tag: 'h3',
1719
- },
1720
- ],
1721
- rightSlot: [
1722
- {
1723
- name: `${this.name}-filter-close-button`,
1724
- component: 'ZdModalCloseButton',
1725
- small: true,
1726
- modalName: `${this.name}-filter-modal`,
1727
- },
1728
- ],
1729
- },
1730
- {
1731
- name: `${this.name}-filter-form`,
1732
- component: 'ZdForm',
1733
- cssClass: 'zd-my-4',
1734
- children: this.getFilterModalComponents(),
1735
- events: {
1736
- onMounted: this.loadFilterValues.bind(this),
1737
- },
1738
- },
1739
- {
1740
- name: `${this.name}-filter-footer`,
1741
- component: 'ZdFooter',
1742
- color: 'transparent',
1743
- padless: true,
1744
- rightSlot: [
1745
- {
1746
- name: `${this.name}-filter-cancelButton`,
1747
- component: 'ZdButton',
1748
- label: 'CANCEL',
1749
- outline: true,
1750
- events: {
1751
- click: this.hideFilterModal.bind(this),
1752
- },
1753
- },
1754
- {
1755
- name: `${this.name}-filter-okButton`,
1756
- component: 'ZdButton',
1757
- label: 'OK',
1758
- events: {
1759
- click: this.applyFilter.bind(this),
1760
- },
1761
- },
1762
- ],
1763
- },
1764
- ],
1765
- };
1766
- this.filterModal = common.ModalService.create(filterModalDef);
1907
+ /**
1908
+ * Updates filtered data
1909
+ */
1910
+ updateFilteredData() {
1911
+ super.updateFilteredData();
1912
+ if (this.dynamicFilter && Object.keys(this.dynamicFilter).length) {
1913
+ this.filteredData = this.filteredData.filter((row) => this.getRowByDynamicFilter(row));
1914
+ }
1915
+ if (this.searchJoin && Object.keys(this.searchJoin).length) {
1916
+ this.filteredData = this.filteredData.filter((row) => this.getRowBySearchJoin(row));
1767
1917
  }
1768
- this.filterModal.show();
1769
- }
1770
- hideFilterModal() {
1771
- this.filterModal.hide();
1772
1918
  }
1773
- getFilterModalComponents() {
1774
- const filterColumns = [];
1775
- this.columns.forEach((column) => {
1776
- const filterProps = Array.isArray(column.filterProps) ? column.filterProps : [column.filterProps];
1777
- if (column.filterable && filterProps && filterProps.length > 0) {
1778
- filterProps.forEach((filterItem) => {
1779
- if (this.datasource instanceof TekRestDatasource || this.datasource instanceof TekMemoryDatasource) {
1780
- const relation = filterItem.relation || 'AND';
1781
- const operation = filterItem.operation || 'CONTAINS';
1782
- filterColumns.push(Object.assign(Object.assign(Object.assign({ label: column.label }, column.componentProps), filterItem), { name: `${this.name}-filter-${relation}-${operation}-${column.name}` }));
1919
+ getRowByDynamicFilter(row) {
1920
+ let filtered;
1921
+ Object.keys(this.dynamicFilter).forEach((key) => {
1922
+ const filterItems = this.dynamicFilter[key];
1923
+ filterItems.forEach((item) => {
1924
+ if (filtered === false && item.relation === 'AND')
1925
+ return;
1926
+ if (filtered === true && item.relation === 'OR')
1927
+ return;
1928
+ const columnValue = core.normalize(row[key].toString());
1929
+ let value = '';
1930
+ if (Array.isArray(item.value)) {
1931
+ value = item.value.map((val) => core.normalize(val.toString()));
1932
+ switch (item.operation) {
1933
+ case 'IN':
1934
+ filtered = value.includes(columnValue);
1935
+ break;
1936
+ case 'NOT_IN':
1937
+ filtered = !value.includes(columnValue);
1938
+ break;
1939
+ case 'BETWEEN':
1940
+ filtered = (Number(columnValue) || columnValue) >= (Number(value[0]) || value[0])
1941
+ && (Number(columnValue) || columnValue) <= (Number(value[1]) || value[1]);
1942
+ break;
1783
1943
  }
1784
- else {
1785
- filterColumns.push(Object.assign(Object.assign(Object.assign({ label: column.label }, column.componentProps), filterItem), { name: `${this.name}-filter-AND-CONTAINS-${column.name}` }));
1944
+ }
1945
+ else {
1946
+ value = core.normalize(item.value.toString());
1947
+ switch (item.operation) {
1948
+ case 'CONTAINS':
1949
+ filtered = columnValue.indexOf(value) !== -1;
1950
+ break;
1951
+ case 'NOT_CONTAINS':
1952
+ filtered = columnValue.indexOf(value) === -1;
1953
+ break;
1954
+ case 'EQUALS':
1955
+ filtered = columnValue === value;
1956
+ break;
1957
+ case 'NOT_EQUALS':
1958
+ filtered = columnValue !== value;
1959
+ break;
1960
+ case 'GREATER_THAN':
1961
+ filtered = (Number(columnValue) || columnValue) > (Number(value) || value);
1962
+ break;
1963
+ case 'LESS_THAN':
1964
+ filtered = (Number(columnValue) || columnValue) < (Number(value) || value);
1965
+ break;
1966
+ case 'GREATER_THAN_EQUALS':
1967
+ filtered = (Number(columnValue) || columnValue) >= (Number(value) || value);
1968
+ break;
1969
+ case 'LESS_THAN_EQUALS':
1970
+ filtered = (Number(columnValue) || columnValue) <= (Number(value) || value);
1971
+ break;
1786
1972
  }
1787
- });
1973
+ }
1974
+ });
1975
+ });
1976
+ return filtered;
1977
+ }
1978
+ getRowBySearchJoin(row) {
1979
+ return Object.keys(this.searchJoin).some((key) => this.searchJoin[key].includes(row[key]));
1980
+ }
1981
+ }
1982
+ core.DatasourceFactory.register('tek-memory', TekMemoryDatasource);
1983
+
1984
+ /**
1985
+ * Base class for TekGrid column
1986
+ */
1987
+ class TekGridColumn extends common.GridColumnEditable {
1988
+ /* istanbul ignore next */
1989
+ /**
1990
+ * Creates a new TekGrid Column.
1991
+ * @param props TekGrid column properties
1992
+ */
1993
+ constructor(props, grid) {
1994
+ super(props);
1995
+ /* filter component props */
1996
+ this.filterProps = [];
1997
+ /* column can be use to filter */
1998
+ this.filterable = true;
1999
+ /* column is fixed */
2000
+ this.fixed = false;
2001
+ /* column is grouped */
2002
+ this.groupedValue = false;
2003
+ /* Value to show when grouped value is empty */
2004
+ this.groupLabelForEmptyValue = '';
2005
+ /* column is visible */
2006
+ this.isVisibleValue = true;
2007
+ /**
2008
+ * Defines if the column should store the componentProps datasource.data in memory
2009
+ */
2010
+ this.storeData = true;
2011
+ this.lookup = debounce__default["default"]((lookupColumn) => __awaiter(this, void 0, void 0, function* () {
2012
+ var _a, _b;
2013
+ let data = [];
2014
+ if (this.storeData) {
2015
+ data = yield ((_a = this.lookupDatasource) === null || _a === void 0 ? void 0 : _a.get());
2016
+ }
2017
+ else {
2018
+ const dataToLookup = Array.from(new Set(this.dataToLookup)); // remove duplicates
2019
+ this.dataToLookup = [];
2020
+ data = yield ((_b = this.lookupDatasource) === null || _b === void 0 ? void 0 : _b.addFilter(lookupColumn, dataToLookup));
2021
+ }
2022
+ data.forEach((row) => {
2023
+ this.lookupData[row[lookupColumn]] = row;
2024
+ });
2025
+ this.lookupDataCount += 1;
2026
+ }), 100);
2027
+ this.grid = grid;
2028
+ this.isVisible = this.getInitValue('isVisible', props.isVisible, this.isVisible);
2029
+ this.filterProps = this.getInitValue('filterProps', props.filterProps, this.filterProps);
2030
+ this.filterable = this.getInitValue('filterable', props.filterable, this.filterable);
2031
+ this.fixed = this.getInitValue('fixed', props.fixed, this.fixed);
2032
+ this.grouped = this.getInitValue('grouped', props.grouped, this.grouped);
2033
+ this.groupOpened = this.getInitValue('groupOpened', props.groupOpened, this.groupOpened);
2034
+ this.aggregation = this.getInitValue('aggregation', props.aggregation, this.aggregation);
2035
+ this.groupLabelForEmptyValue = this.getInitValue('groupLabelForEmptyValue', props.groupLabelForEmptyValue, this.groupLabelForEmptyValue);
2036
+ this.storeData = this.getInitValue('storeData', props.storeData, this.storeData);
2037
+ this.createAccessors();
2038
+ }
2039
+ getLookupData(lookupColumn, value) {
2040
+ const emptyRow = {};
2041
+ if (this.lookupData[value]) {
2042
+ return this.lookupData[value];
2043
+ }
2044
+ this.lookupData[value] = emptyRow;
2045
+ const dataIndex = this.lookupDatasource.data.findIndex((row) => row[lookupColumn] === value);
2046
+ if (dataIndex !== -1) {
2047
+ this.lookupData[value] = this.lookupDatasource.data[dataIndex];
2048
+ return this.lookupData[value];
2049
+ }
2050
+ this.dataToLookup = (this.dataToLookup || []);
2051
+ this.dataToLookup.push(value);
2052
+ this.lookup(lookupColumn);
2053
+ return emptyRow;
2054
+ }
2055
+ /**
2056
+ * Memory search, without changing lookupDatasource
2057
+ */
2058
+ memorySearch(search) {
2059
+ return __awaiter(this, void 0, void 0, function* () {
2060
+ if (!this.lookupDatasource) {
2061
+ throw new Error('Can\'t search in a column that doesn\'t have a datasource');
2062
+ }
2063
+ let { data } = this.lookupDatasource;
2064
+ if (this.storeData) {
2065
+ if (!data.length) {
2066
+ data = yield this.lookupDatasource.get();
2067
+ }
2068
+ }
2069
+ else {
2070
+ // datasource without the lookup filters
2071
+ const defaultDs = core.DatasourceFactory.factory(Object.assign(Object.assign({}, this.componentProps.datasource), { lazyLoad: true, loadAll: true }));
2072
+ data = yield defaultDs.get();
1788
2073
  }
2074
+ const { dataText } = this.componentProps;
2075
+ const searchIn = Array.isArray(dataText) ? dataText : [dataText];
2076
+ // get datasource as memory
2077
+ const datasource = core.DatasourceFactory.factory({
2078
+ searchIn,
2079
+ data,
2080
+ type: 'memory',
2081
+ loadAll: true,
2082
+ });
2083
+ return datasource.setSearch(search);
1789
2084
  });
1790
- return filterColumns;
1791
2085
  }
1792
- loadFilterValues({ component }) {
1793
- if (this.datasource instanceof TekRestDatasource || this.datasource instanceof TekMemoryDatasource) {
1794
- const { dynamicFilter } = this.datasource;
1795
- Object.keys(dynamicFilter).forEach((column) => {
1796
- if (dynamicFilter[column] && dynamicFilter[column].length > 0) {
1797
- dynamicFilter[column].forEach((filterItem) => {
1798
- const relation = filterItem.relation || 'AND';
1799
- const operation = filterItem.operation || 'CONTAINS';
1800
- const compName = `${this.name}-filter-${relation}-${operation}-${column}`;
1801
- component.value[compName] = filterItem.value;
1802
- });
1803
- }
1804
- });
2086
+ get grouped() {
2087
+ return this.groupedValue;
2088
+ }
2089
+ set grouped(value) {
2090
+ const changed = value !== this.groupedValue;
2091
+ this.groupedValue = value;
2092
+ if (changed) {
2093
+ this.changeGrouping();
1805
2094
  }
1806
- else {
1807
- const { filter } = this.datasource;
1808
- Object.keys(filter).forEach((item) => {
1809
- if (filter[item]) {
1810
- component.value[`${this.name}-filter-AND-CONTAINS-${item}`] = filter[item];
1811
- }
1812
- });
2095
+ }
2096
+ get aggregation() {
2097
+ return this.aggregationValue;
2098
+ }
2099
+ set aggregation(value) {
2100
+ const changed = value !== this.aggregationValue;
2101
+ this.aggregationValue = value;
2102
+ if (changed) {
2103
+ this.changeGrouping();
1813
2104
  }
1814
2105
  }
1815
- applyFilter({ event }) {
1816
- const filterForm = core.Metadata.getInstance(`${this.name}-filter-form`);
1817
- if (filterForm.validate()) {
1818
- if (this.datasource instanceof TekRestDatasource || this.datasource instanceof TekMemoryDatasource) {
1819
- const dynamicFilter = {};
1820
- Object.keys(filterForm.value).forEach((item) => {
1821
- if (filterForm.value[item]) {
1822
- const relationAndOperationAndName = item.split(`${this.name}-filter-`)[1];
1823
- const [relation, operation] = relationAndOperationAndName.split('-');
1824
- const columnName = relationAndOperationAndName.split(`${relation}-${operation}-`)[1];
1825
- if (!dynamicFilter[columnName]) {
1826
- dynamicFilter[columnName] = [];
1827
- }
1828
- let value = filterForm.value[item];
1829
- if (['IN', 'NOT_IN', 'BETWEEN'].includes(operation) && !Array.isArray(value)) {
1830
- value = value.split(';').map((valueItem) => valueItem.trim());
1831
- }
1832
- dynamicFilter[columnName].push({
1833
- relation,
1834
- operation,
1835
- value,
1836
- });
1837
- }
1838
- });
1839
- this.datasource.dynamicFilter = dynamicFilter;
1840
- }
1841
- else {
1842
- Object.keys(filterForm.value).forEach((item) => {
1843
- const columnName = item.split(`${this.name}-filter-AND-CONTAINS-`)[1];
1844
- if (filterForm.value[item]) {
1845
- this.datasource.filter[columnName] = filterForm.value[item];
1846
- }
1847
- else {
1848
- delete this.datasource.filter[columnName];
1849
- }
1850
- });
1851
- }
1852
- if (this.events.beforeApplyFilter) {
1853
- this.events.beforeApplyFilter({ event, component: this });
1854
- }
1855
- if (!event.defaultPrevented) {
1856
- this.datasource.get();
1857
- this.filterModal.hide();
1858
- }
1859
- this.changeLayout(event);
2106
+ get isVisible() {
2107
+ return this.isVisibleValue && !this.grouped;
2108
+ }
2109
+ set isVisible(value) {
2110
+ this.isVisibleValue = value;
2111
+ }
2112
+ changeGrouping() {
2113
+ // wait for grid.constructor to be fully executed
2114
+ setTimeout(() => {
2115
+ this.grid.updateGrouping();
2116
+ });
2117
+ }
2118
+ }
2119
+
2120
+ /* TekGrid Class */
2121
+ class TekGrid extends common.GridEditable {
2122
+ /**
2123
+ * TekGrid class constructor
2124
+ * @param props TekGrid properties
2125
+ */
2126
+ constructor(props) {
2127
+ var _a;
2128
+ super(Object.assign(Object.assign({}, props), { datasource: Object.assign(Object.assign({}, props.datasource), { lazyLoad: true }) }));
2129
+ /* Grid Title */
2130
+ this.title = '';
2131
+ /* Show Add button */
2132
+ this.addButton = false;
2133
+ /* Show Delete button */
2134
+ this.deleteButton = 'none';
2135
+ /* Show Delete button */
2136
+ this.actions = [];
2137
+ /* Show Filter button */
2138
+ this.filterButton = false;
2139
+ /* Show Column Filter button */
2140
+ this.columnFilterButton = false;
2141
+ /* Show Columns button */
2142
+ this.columnsButton = false;
2143
+ /* Columns to be ignored on columns button */
2144
+ this.columnsButtonIgnore = [];
2145
+ /**
2146
+ * Enables column dragging
2147
+ * @public
2148
+ */
2149
+ this.dragColumns = true;
2150
+ /**
2151
+ * Enables column resizing
2152
+ * @public
2153
+ */
2154
+ this.resizeColumns = true;
2155
+ /**
2156
+ * Enables layout saving
2157
+ * @public
2158
+ */
2159
+ this.showLayoutOptions = true;
2160
+ /**
2161
+ * Show export button
2162
+ */
2163
+ this.showExport = false;
2164
+ /**
2165
+ * Show refresh button
2166
+ */
2167
+ this.showReload = true;
2168
+ /**
2169
+ * Export config
2170
+ */
2171
+ this.exportConfig = [
2172
+ {
2173
+ type: 'pdf',
2174
+ label: core.I18n.translate('TEKGRID_EXPORT_AS', { type: 'PDF' }),
2175
+ },
2176
+ {
2177
+ type: 'xls',
2178
+ label: core.I18n.translate('TEKGRID_EXPORT_AS', { type: `XLS ${core.I18n.translate('TEKGRID_WITHOUT_GROUPS')}` }),
2179
+ },
2180
+ {
2181
+ type: 'xls2',
2182
+ label: core.I18n.translate('TEKGRID_EXPORT_AS', { type: `XLS ${core.I18n.translate('TEKGRID_WITH_GROUPS')}` }),
2183
+ },
2184
+ {
2185
+ type: 'xls3',
2186
+ label: core.I18n.translate('TEKGRID_EXPORT_AS', { type: `XLS ${core.I18n.translate('TEKGRID_GRID_MIRROR')}` }),
2187
+ },
2188
+ {
2189
+ type: 'csv',
2190
+ label: core.I18n.translate('TEKGRID_EXPORT_AS', { type: 'CSV' }),
2191
+ },
2192
+ ];
2193
+ /**
2194
+ * Groups should be opened by default after building
2195
+ */
2196
+ this.groupsOpened = false;
2197
+ /**
2198
+ * Show Total summary
2199
+ */
2200
+ this.showSummaryTotal = true;
2201
+ this.groupColumnNames = [];
2202
+ this.summaryColumns = [];
2203
+ this.groupColumns = [];
2204
+ this.groupedData = [];
2205
+ this.toolbarSlotProps = false;
2206
+ this.groups = [];
2207
+ this.summary = {};
2208
+ this.updateGrouping = debounce__default["default"]((lazyLoad = false) => {
2209
+ this.updateGroupedData(lazyLoad);
2210
+ }, 500);
2211
+ this.title = this.getInitValue('title', props.title, this.title);
2212
+ this.addButton = this.getInitValue('addButton', props.addButton, this.addButton);
2213
+ this.deleteButton = this.getInitValue('deleteButton', props.deleteButton, this.deleteButton);
2214
+ this.filterButton = this.getInitValue('filterButton', props.filterButton, this.filterButton);
2215
+ this.columnFilterButton = this.getInitValue('columnFilterButton', props.columnFilterButton, this.columnFilterButton);
2216
+ this.columnsButton = this.getInitValue('columnsButton', props.columnsButton, this.columnsButton);
2217
+ this.columnsButtonIgnore = this.getInitValue('columnsButtonIgnore', props.columnsButtonIgnore, this.columnsButtonIgnore);
2218
+ this.dragColumns = this.getInitValue('dragColumns', props.dragColumns, this.dragColumns);
2219
+ this.resizeColumns = this.getInitValue('resizeColumns', props.resizeColumns, this.resizeColumns);
2220
+ this.showLayoutOptions = this.getInitValue('showLayoutOptions', props.showLayoutOptions, this.showLayoutOptions);
2221
+ this.showExport = this.getInitValue('showExport', props.showExport, this.showExport);
2222
+ this.showReload = this.getInitValue('showReload', props.showReload, this.showReload);
2223
+ this.exportConfig = this.getInitValue('exportConfig', props.exportConfig, this.exportConfig);
2224
+ this.exportActions = props.exportActions || this.exportActions;
2225
+ this.groupsOpened = this.getInitValue('groupsOpened', props.groupsOpened, this.groupsOpened);
2226
+ this.showSummaryTotal = this.getInitValue('showSummaryTotal', props.showSummaryTotal, this.showSummaryTotal);
2227
+ this.actions = props.actions || this.actions;
2228
+ this.toolbarSlotProps = props.toolbarSlot !== undefined;
2229
+ if (this.deleteButton === 'selection') {
2230
+ this.selectable = true;
1860
2231
  }
2232
+ this.gridBase = new GridBase(this);
2233
+ this.filterOperationsDatasource = this.gridBase.getFilterOperationsDatasource();
2234
+ this.filterRelationsDatasource = this.gridBase.getFilterRelationsDatasource();
2235
+ this.createAccessors();
2236
+ this.initGrouping((_a = props.datasource) === null || _a === void 0 ? void 0 : _a.lazyLoad);
2237
+ }
2238
+ onCreated() {
2239
+ super.onCreated();
2240
+ core.Loader.addController(`GridController_${this.componentId}`, new GridController(this));
2241
+ if (!this.toolbarSlotProps)
2242
+ this.toolbarSlot = this.gridBase.createToolbarProps();
2243
+ this.navigationKeyMapping.left = {
2244
+ event: this.navigateLeft.bind(this),
2245
+ stop: true,
2246
+ active: true,
2247
+ };
2248
+ this.navigationKeyMapping.right = {
2249
+ event: this.navigateRight.bind(this),
2250
+ stop: true,
2251
+ active: true,
2252
+ };
2253
+ }
2254
+ /**
2255
+ * Get Grid columns objects
2256
+ * @param columns Grid columns parameter
2257
+ */
2258
+ getColumns(columns) {
2259
+ return columns.map((column) => new TekGridColumn(column, this));
1861
2260
  }
1862
2261
  columnHasFilterData(column) {
1863
2262
  if (this.datasource instanceof TekRestDatasource || this.datasource instanceof TekMemoryDatasource) {
@@ -1866,22 +2265,6 @@
1866
2265
  }
1867
2266
  return this.datasource.filter[column.name];
1868
2267
  }
1869
- getFilterOptionsData(prop) {
1870
- if (this.datasource instanceof TekRestDatasource || this.datasource instanceof TekMemoryDatasource) {
1871
- let options;
1872
- if (prop === 'relations') {
1873
- options = Object.keys(this.datasource.dynamicFilterRelations);
1874
- }
1875
- else {
1876
- options = Object.keys(this.datasource.dynamicFilterOperations);
1877
- }
1878
- return options.map((item) => ({
1879
- text: `TEKGRID_${item}`,
1880
- value: item,
1881
- }));
1882
- }
1883
- return [];
1884
- }
1885
2268
  buildReportGroups() {
1886
2269
  return this.columns.filter((column) => column.grouped).map((column) => ({
1887
2270
  field: column.name,
@@ -1983,6 +2366,9 @@
1983
2366
  groupBreak = true;
1984
2367
  }
1985
2368
  });
2369
+ this.groups.forEach((group) => {
2370
+ group.lastGroupHeaderRow.children.push(row);
2371
+ });
1986
2372
  this.groupedData.push(Object.assign(Object.assign({}, row), { groupHeaders: this.groups.map((group) => group.lastGroupHeaderRow).filter(Boolean) }));
1987
2373
  this.calcSummary(row);
1988
2374
  });
@@ -2024,6 +2410,7 @@
2024
2410
  groupValue,
2025
2411
  groupOpened: group.column.groupOpened || this.groupsOpened,
2026
2412
  groupHeaders: [],
2413
+ children: [],
2027
2414
  };
2028
2415
  // add header for outer groups to the added row
2029
2416
  for (let i = 0; i < index; i += 1) {
@@ -2144,29 +2531,16 @@
2144
2531
  const groupValue = groupColumn.formatterByRow(row, cellProps);
2145
2532
  return groupValue;
2146
2533
  }
2147
- getEditedRows() {
2148
- return super.getEditedRows().map((row) => {
2149
- const cleanRow = Object.assign({}, row);
2150
- delete cleanRow.groupHeaders;
2151
- return cleanRow;
2152
- });
2153
- }
2154
- setSearch(search) {
2155
- return __awaiter(this, void 0, void 0, function* () {
2156
- if (this.datasource instanceof TekRestDatasource || this.datasource instanceof TekMemoryDatasource) {
2157
- const lookupColumns = this.columns.filter((column) => !!column.componentProps.datasource);
2158
- const searchJoin = {};
2159
- if (search) {
2160
- const promises = lookupColumns.map((column) => __awaiter(this, void 0, void 0, function* () {
2161
- const searchData = yield column.memorySearch(search);
2162
- const lookupId = column.componentProps.datasource.uniqueKey;
2163
- searchJoin[column.name] = searchData.map((row) => row[lookupId]);
2164
- }));
2165
- yield Promise.all(promises);
2166
- }
2167
- this.datasource.searchJoin = searchJoin;
2168
- }
2169
- return this.datasource.setSearch(search);
2534
+ getEditedRows() {
2535
+ return super.getEditedRows().map((row) => {
2536
+ const cleanRow = Object.assign({}, row);
2537
+ delete cleanRow.groupHeaders;
2538
+ return cleanRow;
2539
+ });
2540
+ }
2541
+ setSearch(search) {
2542
+ return __awaiter(this, void 0, void 0, function* () {
2543
+ return this.gridBase.setSearch(search);
2170
2544
  });
2171
2545
  }
2172
2546
  isGrouped() {
@@ -2198,253 +2572,96 @@
2198
2572
  }
2199
2573
  navigateUp(params) {
2200
2574
  if (!this.isGrouped()) {
2201
- super.navigateUp();
2202
- }
2203
- else {
2204
- const { index } = params;
2205
- if (!this.groupedData.length || index === -1)
2206
- return;
2207
- const { uniqueKey, currentRow } = this.datasource;
2208
- let rowIndex;
2209
- rowIndex = index !== undefined ? index : this.groupedData.findIndex((row) => {
2210
- if (currentRow.group) {
2211
- return row.group && row.groupValue === currentRow.groupValue;
2212
- }
2213
- return row[uniqueKey] && row[uniqueKey] === currentRow[uniqueKey];
2214
- });
2215
- if (rowIndex === -1)
2216
- rowIndex = this.groupedData.length;
2217
- const newRow = this.groupedData[rowIndex - 1];
2218
- if (newRow && this.isItemVisible(newRow) && !newRow.groupFooter) {
2219
- this.datasource.currentRow = newRow;
2220
- }
2221
- else {
2222
- this.navigateUp({ index: rowIndex - 1 });
2223
- }
2224
- }
2225
- }
2226
- navigateLeft() {
2227
- var _a;
2228
- const { currentRow } = this.datasource;
2229
- if (currentRow.group && currentRow.groupOpened) {
2230
- currentRow.groupOpened = false;
2231
- }
2232
- else if ((_a = currentRow.groupHeaders) === null || _a === void 0 ? void 0 : _a.length) {
2233
- this.datasource.currentRow = currentRow.groupHeaders[currentRow.groupHeaders.length - 1];
2234
- }
2235
- }
2236
- navigateRight() {
2237
- const { currentRow } = this.datasource;
2238
- if (currentRow.group && !currentRow.groupOpened) {
2239
- currentRow.groupOpened = true;
2240
- }
2241
- }
2242
- /**
2243
- * Dispatches row click event
2244
- * @param row Grid row
2245
- * @param event DOM event
2246
- * @param element DOM Element
2247
- */
2248
- rowClick(row, event, element) {
2249
- if (!this.preventRowClick) {
2250
- this.datasource.currentRow = row;
2251
- this.callEvent('rowClick', {
2252
- event, element, row, component: this, column: undefined,
2253
- });
2254
- }
2255
- this.preventRowClick = false;
2256
- }
2257
- /**
2258
- * Dispatches group row click event
2259
- * @param row Grid row
2260
- * @param event DOM event
2261
- * @param element DOM Element
2262
- */
2263
- groupRowClick(row, event, element) {
2264
- if (!this.preventRowClick) {
2265
- this.callEvent('groupRowClick', {
2266
- event, element, row, component: this, column: undefined,
2267
- });
2268
- }
2269
- this.preventRowClick = false;
2270
- }
2271
- }
2272
- core.Messages.add({
2273
- 'pt-BR': {
2274
- translation: {
2275
- TEKGRID_CONTAINS: 'contém',
2276
- TEKGRID_NOT_CONTAINS: 'não contém',
2277
- TEKGRID_EQUALS: 'é igual a',
2278
- TEKGRID_NOT_EQUALS: diferente de',
2279
- TEKGRID_GREATER_THAN: maior que',
2280
- TEKGRID_LESS_THAN: 'é menor que',
2281
- TEKGRID_GREATER_THAN_EQUALS: maior ou igual a',
2282
- TEKGRID_LESS_THAN_EQUALS: 'é menor ou igual a',
2283
- TEKGRID_IN: 'um dos valores',
2284
- TEKGRID_NOT_IN: 'nenhum dos valores',
2285
- TEKGRID_BETWEEN: 'está entre',
2286
- TEKGRID_AND: 'e',
2287
- TEKGRID_OR: 'ou',
2288
- TEKGRID_ADD: 'Adicionar',
2289
- TEKGRID_DELETE: 'Excluir',
2290
- TEKGRID_REFRESH: 'Atualizar',
2291
- TEKGRID_COLUMNS: 'Colunas',
2292
- TEKGRID_SAVE: 'Salvar',
2293
- TEKGRID_CANCEL: 'Cancelar',
2294
- TEKGRID_APPLY: 'Aplicar',
2295
- TEKGRID_FILTER: 'Filtro',
2296
- TEKGRID_MULTIPLE_VALUE_HINT: 'Separe valores usando ";"',
2297
- TEKGRID_EXPORT: 'Exportar',
2298
- TEKGRID_EXPORT_AS: 'Exportar como {{ type }}',
2299
- TEKGRID_COLUMN_VISIBLE: 'Visível',
2300
- TEKGRID_COLUMN_GROUPED: 'Grupo',
2301
- TEKGRID_COLUMN_AGGREGATION: 'Totalização',
2302
- TEKGRID_COLUMN_LABEL: 'Rótulo',
2303
- TEKGRID_COLUMN_ALIGNMENT: 'Alinhamento',
2304
- TEKGRID_COLUMN_GROUP_OPENED: 'Aberto (grupo)',
2305
- TEKGRID_COLUMN_ORDER: 'Ordem',
2306
- TEKGRID_COLUMN_ORDER_DIRECTION: 'Direção (ordem)',
2307
- TEKGRID_AGGREGATION_SUM: 'Soma',
2308
- TEKGRID_AGGREGATION_AVG: 'Média',
2309
- TEKGRID_AGGREGATION_MAX: 'Máximo',
2310
- TEKGRID_AGGREGATION_MIN: 'Mínimo',
2311
- TEKGRID_AGGREGATION_COUNT: 'Contador',
2312
- TEKGRID_MORE_OPTIONS: 'Mais opções',
2313
- TEKGRID_COLUMNS_OPTIONS: 'Configuração de colunas',
2314
- TEKGRID_CLOSE: 'Fechar',
2315
- TEKGRID_FIXED_COLUMNS: 'Colunas fixadas',
2316
- TEKGRID_VISIBLE_COLUMNS: 'Colunas visíveis',
2317
- TEKGRID_GROUPED_COLUMNS: 'Colunas agrupadas',
2318
- TEKGRID_ORDER: 'Ordem',
2319
- TEKGRID_OTHER_COLUMNS: 'Outras colunas',
2320
- TEKGRID_DROP_COLUMNS: 'Arraste colunas aqui',
2321
- TEKGRID_DETAILS_FOR: 'Detalhes para:',
2322
- TEKGRID_LEFT: 'Esquerda',
2323
- TEKGRID_CENTER: 'Centro',
2324
- TEKGRID_RIGHT: 'Direita',
2325
- TEKGRID_ASC: 'Crescente',
2326
- TEKGRID_DESC: 'Decrescente',
2327
- TEKGRID_SELECT_COLUMN: '(selecione uma ou mais colunas)',
2328
- TEKGRID_SELECT_ALL: 'Selecionar todas',
2329
- },
2330
- },
2331
- 'en-US': {
2332
- translation: {
2333
- TEKGRID_CONTAINS: 'contains',
2334
- TEKGRID_NOT_CONTAINS: 'does not contain',
2335
- TEKGRID_EQUALS: 'is equal to',
2336
- TEKGRID_NOT_EQUALS: 'is differente from',
2337
- TEKGRID_GREATER_THAN: 'is greater than',
2338
- TEKGRID_LESS_THAN: 'is less than',
2339
- TEKGRID_GREATER_THAN_EQUALS: 'is greater or equals to',
2340
- TEKGRID_LESS_THAN_EQUALS: 'is less or equals to',
2341
- TEKGRID_IN: 'is in',
2342
- TEKGRID_NOT_IN: 'is not in',
2343
- TEKGRID_BETWEEN: 'is between',
2344
- TEKGRID_AND: 'and',
2345
- TEKGRID_OR: 'or',
2346
- TEKGRID_ADD: 'Add',
2347
- TEKGRID_DELETE: 'Delete',
2348
- TEKGRID_REFRESH: 'Refresh',
2349
- TEKGRID_COLUMNS: 'Columns',
2350
- TEKGRID_SAVE: 'Save',
2351
- TEKGRID_CANCEL: 'Cancel',
2352
- TEKGRID_APPLY: 'Apply',
2353
- TEKGRID_FILTER: 'Filter',
2354
- TEKGRID_MULTIPLE_VALUE_HINT: 'Separate values using ";"',
2355
- TEKGRID_EXPORT: 'Export',
2356
- TEKGRID_EXPORT_AS: 'Export as {{ type }}',
2357
- TEKGRID_COLUMN_VISIBLE: 'Visible',
2358
- TEKGRID_COLUMN_GROUPED: 'Grouped',
2359
- TEKGRID_COLUMN_AGGREGATION: 'Aggregation',
2360
- TEKGRID_COLUMN_LABEL: 'Label',
2361
- TEKGRID_COLUMN_ALIGNMENT: 'Alignment',
2362
- TEKGRID_COLUMN_GROUP_OPENED: 'Opened (group)',
2363
- TEKGRID_COLUMN_ORDER: 'Order',
2364
- TEKGRID_COLUMN_ORDER_DIRECTION: 'Direction (order)',
2365
- TEKGRID_AGGREGATION_SUM: 'Sum',
2366
- TEKGRID_AGGREGATION_AVG: 'Average',
2367
- TEKGRID_AGGREGATION_MAX: 'Maximum',
2368
- TEKGRID_AGGREGATION_MIN: 'Minimum',
2369
- TEKGRID_AGGREGATION_COUNT: 'Count',
2370
- TEKGRID_MORE_OPTIONS: 'More options',
2371
- TEKGRID_COLUMNS_OPTIONS: 'Columns configuration',
2372
- TEKGRID_CLOSE: 'Close',
2373
- TEKGRID_FIXED_COLUMNS: 'Fixed columns',
2374
- TEKGRID_VISIBLE_COLUMNS: 'Visible columns',
2375
- TEKGRID_GROUPED_COLUMNS: 'Grouped columns',
2376
- TEKGRID_ORDER: 'Order',
2377
- TEKGRID_OTHER_COLUMNS: 'Other columns',
2378
- TEKGRID_DROP_COLUMNS: 'Drop columns here',
2379
- TEKGRID_DETAILS_FOR: 'Details for:',
2380
- TEKGRID_LEFT: 'Left',
2381
- TEKGRID_CENTER: 'Center',
2382
- TEKGRID_RIGHT: 'Right',
2383
- TEKGRID_ASC: 'Ascending',
2384
- TEKGRID_DESC: 'Descending',
2385
- TEKGRID_SELECT_COLUMN: '(select one or more columns)',
2386
- TEKGRID_SELECT_ALL: 'Select all',
2387
- },
2388
- },
2389
- 'es-ES': {
2390
- translation: {
2391
- TEKGRID_CONTAINS: 'contiene',
2392
- TEKGRID_NOT_CONTAINS: 'no contiene',
2393
- TEKGRID_EQUALS: 'igual',
2394
- TEKGRID_NOT_EQUALS: 'es diferente de',
2395
- TEKGRID_GREATER_THAN: 'es mayor que',
2396
- TEKGRID_LESS_THAN: 'es menor que',
2397
- TEKGRID_GREATER_THAN_EQUALS: 'es mayor o igual que',
2398
- TEKGRID_LESS_THAN_EQUALS: 'es menor o igual que',
2399
- TEKGRID_IN: 'uno de los valores',
2400
- TEKGRID_NOT_IN: 'ninguno de los valores',
2401
- TEKGRID_BETWEEN: 'está entre',
2402
- TEKGRID_AND: 'e',
2403
- TEKGRID_OR: 'o',
2404
- TEKGRID_ADD: 'Añadir',
2405
- TEKGRID_DELETE: 'Eliminar',
2406
- TEKGRID_REFRESH: 'Actualizar',
2407
- TEKGRID_COLUMNS: 'Colunas',
2408
- TEKGRID_SAVE: 'Guardar',
2409
- TEKGRID_CANCEL: 'Cancelar',
2410
- TEKGRID_APPLY: 'Aplicar',
2411
- TEKGRID_FILTER: 'Filtro',
2412
- TEKGRID_MULTIPLE_VALUE_HINT: 'Separe los valores usando ";"',
2413
- TEKGRID_EXPORT: 'Exportar',
2414
- TEKGRID_EXPORT_AS: 'Exportar como {{ type }}',
2415
- TEKGRID_COLUMN_VISIBLE: 'Visible',
2416
- TEKGRID_COLUMN_GROUPED: 'Grupo',
2417
- TEKGRID_COLUMN_AGGREGATION: 'Totalización',
2418
- TEKGRID_COLUMN_LABEL: 'Etiqueta',
2419
- TEKGRID_COLUMN_ALIGNMENT: 'alineación',
2420
- TEKGRID_COLUMN_GROUP_OPENED: 'Abierto (grupo)',
2421
- TEKGRID_COLUMN_ORDER: 'Orden',
2422
- TEKGRID_COLUMN_ORDER_DIRECTION: 'Dirección (orden)',
2423
- TEKGRID_AGGREGATION_SUM: 'Suma',
2424
- TEKGRID_AGGREGATION_AVG: 'Media',
2425
- TEKGRID_AGGREGATION_MAX: 'Máximo',
2426
- TEKGRID_AGGREGATION_MIN: 'Mínimo',
2427
- TEKGRID_AGGREGATION_COUNT: 'Contar',
2428
- TEKGRID_MORE_OPTIONS: 'Mas opciones',
2429
- TEKGRID_COLUMNS_OPTIONS: 'Configuración de columna',
2430
- TEKGRID_CLOSE: 'Cerrar',
2431
- TEKGRID_FIXED_COLUMNS: 'Columnas fijas',
2432
- TEKGRID_VISIBLE_COLUMNS: 'Columnas visibles',
2433
- TEKGRID_GROUPED_COLUMNS: 'Columnas agrupadas',
2434
- TEKGRID_ORDER: 'Orden',
2435
- TEKGRID_OTHER_COLUMNS: 'Otras columnas',
2436
- TEKGRID_DROP_COLUMNS: 'Arrastra columnas aquí',
2437
- TEKGRID_DETAILS_FOR: 'Detalles para',
2438
- TEKGRID_LEFT: 'Izquierda',
2439
- TEKGRID_CENTER: 'Centro',
2440
- TEKGRID_RIGHT: 'Derecha',
2441
- TEKGRID_ASC: 'Creciente',
2442
- TEKGRID_DESC: 'Decreciente',
2443
- TEKGRID_SELECT_COLUMN: '(seleccione una o más columnas)',
2444
- TEKGRID_SELECT_ALL: 'Seleccionar todas',
2445
- },
2446
- },
2447
- });
2575
+ super.navigateUp();
2576
+ }
2577
+ else {
2578
+ const { index } = params;
2579
+ if (!this.groupedData.length || index === -1)
2580
+ return;
2581
+ const { uniqueKey, currentRow } = this.datasource;
2582
+ let rowIndex;
2583
+ rowIndex = index !== undefined ? index : this.groupedData.findIndex((row) => {
2584
+ if (currentRow.group) {
2585
+ return row.group && row.groupValue === currentRow.groupValue;
2586
+ }
2587
+ return row[uniqueKey] && row[uniqueKey] === currentRow[uniqueKey];
2588
+ });
2589
+ if (rowIndex === -1)
2590
+ rowIndex = this.groupedData.length;
2591
+ const newRow = this.groupedData[rowIndex - 1];
2592
+ if (newRow && this.isItemVisible(newRow) && !newRow.groupFooter) {
2593
+ this.datasource.currentRow = newRow;
2594
+ }
2595
+ else {
2596
+ this.navigateUp({ index: rowIndex - 1 });
2597
+ }
2598
+ }
2599
+ }
2600
+ navigateLeft() {
2601
+ var _a;
2602
+ const { currentRow } = this.datasource;
2603
+ if (currentRow.group && currentRow.groupOpened) {
2604
+ currentRow.groupOpened = false;
2605
+ }
2606
+ else if ((_a = currentRow.groupHeaders) === null || _a === void 0 ? void 0 : _a.length) {
2607
+ this.datasource.currentRow = currentRow.groupHeaders[currentRow.groupHeaders.length - 1];
2608
+ }
2609
+ }
2610
+ navigateRight() {
2611
+ const { currentRow } = this.datasource;
2612
+ if (currentRow.group && !currentRow.groupOpened) {
2613
+ currentRow.groupOpened = true;
2614
+ }
2615
+ }
2616
+ /**
2617
+ * Dispatches row click event
2618
+ * @param row Grid row
2619
+ * @param event DOM event
2620
+ * @param element DOM Element
2621
+ */
2622
+ rowClick(row, event, element) {
2623
+ if (!this.preventRowClick) {
2624
+ this.datasource.currentRow = row;
2625
+ this.callEvent('rowClick', {
2626
+ event, element, row, component: this, column: undefined,
2627
+ });
2628
+ }
2629
+ this.preventRowClick = false;
2630
+ }
2631
+ /**
2632
+ * Dispatches group row click event
2633
+ * @param row Grid row
2634
+ * @param event DOM event
2635
+ * @param element DOM Element
2636
+ */
2637
+ groupRowClick(row, event, element) {
2638
+ if (!this.preventRowClick) {
2639
+ this.callEvent('groupRowClick', {
2640
+ event, element, row, component: this, column: undefined,
2641
+ });
2642
+ }
2643
+ this.preventRowClick = false;
2644
+ }
2645
+ /**
2646
+ * Dispatches group select/unselect event
2647
+ * @param row Group row
2648
+ * @param isSelected Row is selected
2649
+ * @param event DOM event
2650
+ * @param element DOM Element
2651
+ */
2652
+ selectGroupClick(row, isSelected, event, element) {
2653
+ if (isSelected) {
2654
+ this.callEvent('groupSelected', {
2655
+ event, element, row, component: this, column: undefined,
2656
+ });
2657
+ }
2658
+ else {
2659
+ this.callEvent('groupUnselected', {
2660
+ event, element, row, component: this, column: undefined,
2661
+ });
2662
+ }
2663
+ }
2664
+ }
2448
2665
 
2449
2666
  class TekGridColumnsButtonController extends common.IterableColumnsButtonController {
2450
2667
  changeGroupedColumn(column, { component, event, element }) {
@@ -2468,9 +2685,12 @@
2468
2685
  * Base class for TekGrid Columns Button component
2469
2686
  */
2470
2687
  class TekGridColumnsButton extends common.IterableColumnsButton {
2471
- constructor() {
2472
- super(...arguments);
2688
+ constructor(props) {
2689
+ super(props);
2690
+ this.hideGroups = false;
2473
2691
  this.aggregationDataSet = [];
2692
+ this.hideGroups = this.getInitValue('hideGroups', props.hideGroups, this.hideGroups);
2693
+ this.createAccessors();
2474
2694
  }
2475
2695
  onCreated() {
2476
2696
  super.onCreated();
@@ -2517,20 +2737,19 @@
2517
2737
  this.originalDatasourceOrder = [...this.grid.datasource.order];
2518
2738
  this.originalDatasourceDynamicFilter = Object.assign({}, this.grid.datasource.dynamicFilter);
2519
2739
  this.originalDatasourceFilter = Object.assign({}, this.grid.datasource.filter);
2520
- this.originalColumnProps = this.grid.columns.map((column) => {
2521
- const obj = {};
2522
- obj.name = column.name;
2523
- obj.label = column.label;
2524
- obj.align = column.align;
2525
- obj.isVisible = column.isVisible;
2526
- obj.minWidth = column.minWidth;
2527
- obj.maxWidth = column.maxWidth;
2528
- obj.fixed = column.fixed;
2529
- obj.grouped = column.grouped;
2530
- obj.groupOpened = column.groupOpened;
2531
- obj.aggregation = column.aggregation;
2532
- return obj;
2533
- });
2740
+ this.originalColumnProps = this.grid.columns.map((column) => ({
2741
+ name: column.name,
2742
+ label: column.label,
2743
+ align: column.align,
2744
+ isVisible: column.isVisible,
2745
+ minWidth: column.minWidth,
2746
+ maxWidth: column.maxWidth,
2747
+ fixed: column.fixed,
2748
+ grouped: column.grouped,
2749
+ groupOpened: column.groupOpened,
2750
+ aggregation: column.aggregation,
2751
+ filterHelperValue: this.getHelperValue(column),
2752
+ }));
2534
2753
  let layoutsInfo = {};
2535
2754
  const eventFunction = this.events.loadLayouts || this.grid.events.loadLayouts;
2536
2755
  if (eventFunction && typeof eventFunction === 'function') {
@@ -2549,6 +2768,14 @@
2549
2768
  }
2550
2769
  });
2551
2770
  }
2771
+ getHelperValue(column) {
2772
+ if (column instanceof TekGridColumn) {
2773
+ if (!Array.isArray(column.filterProps))
2774
+ return column.filterProps.helperValue;
2775
+ return column.filterProps.map((prop) => prop.helperValue);
2776
+ }
2777
+ return '';
2778
+ }
2552
2779
  newLayout(newLayout) {
2553
2780
  this.currentLayoutName = newLayout.name;
2554
2781
  this.layouts[this.currentLayoutName] = newLayout;
@@ -2595,6 +2822,240 @@
2595
2822
  }
2596
2823
  }
2597
2824
 
2825
+ class TekFilterHelper {
2826
+ static formatDate(date, column) {
2827
+ if (column.componentProps.dateFormat) {
2828
+ return core.dayjs(date).format(column.componentProps.dateFormat);
2829
+ }
2830
+ return core.dayjs(date).format(core.Config.dateFormat);
2831
+ }
2832
+ static getLabel(name) {
2833
+ return core.I18n.translate(this.values[name].label);
2834
+ }
2835
+ static getValue(name, column) {
2836
+ if (!this.values[name])
2837
+ return '';
2838
+ const value = this.values[name].fn();
2839
+ if (Array.isArray(value)) {
2840
+ return value.map((item) => this.formatDate(item, column));
2841
+ }
2842
+ return this.formatDate(value, column);
2843
+ }
2844
+ static register(name, label, fn) {
2845
+ this.values[name] = {
2846
+ label,
2847
+ fn,
2848
+ };
2849
+ }
2850
+ static unregister(name) {
2851
+ delete this.values[name];
2852
+ }
2853
+ }
2854
+ TekFilterHelper.values = {
2855
+ TODAY: {
2856
+ label: 'TEKGRID_HELPERVALUE_TODAY',
2857
+ fn: () => core.dayjs().toDate(),
2858
+ },
2859
+ TOMORROW: {
2860
+ label: 'TEKGRID_HELPERVALUE_TOMORROW',
2861
+ fn: () => core.dayjs().add(1, 'day').toDate(),
2862
+ },
2863
+ YESTERDAY: {
2864
+ label: 'TEKGRID_HELPERVALUE_YESTERDAY',
2865
+ fn: () => core.dayjs().subtract(1, 'day').toDate(),
2866
+ },
2867
+ LAST_7_DAYS: {
2868
+ label: 'TEKGRID_HELPERVALUE_LAST_7_DAYS',
2869
+ fn: () => {
2870
+ const end = core.dayjs().toDate();
2871
+ const start = core.dayjs().subtract(7, 'day').toDate();
2872
+ return [start, end];
2873
+ },
2874
+ },
2875
+ NEXT_7_DAYS: {
2876
+ label: 'TEKGRID_HELPERVALUE_NEXT_7_DAYS',
2877
+ fn: () => {
2878
+ const start = core.dayjs().toDate();
2879
+ const end = core.dayjs().add(7, 'day').toDate();
2880
+ return [start, end];
2881
+ },
2882
+ },
2883
+ CURRENT_WEEK: {
2884
+ label: 'TEKGRID_HELPERVALUE_CURRENT_WEEK',
2885
+ fn: () => {
2886
+ const start = core.dayjs().startOf('week').toDate();
2887
+ const end = core.dayjs().endOf('week').toDate();
2888
+ return [start, end];
2889
+ },
2890
+ },
2891
+ CURRENT_MONTH: {
2892
+ label: 'TEKGRID_HELPERVALUE_CURRENT_MONTH',
2893
+ fn: () => {
2894
+ const start = core.dayjs().startOf('month').toDate();
2895
+ const end = core.dayjs().endOf('month').toDate();
2896
+ return [start, end];
2897
+ },
2898
+ },
2899
+ CURRENT_YEAR: {
2900
+ label: 'TEKGRID_HELPERVALUE_CURRENT_YEAR',
2901
+ fn: () => {
2902
+ const start = core.dayjs().startOf('year').toDate();
2903
+ const end = core.dayjs().endOf('year').toDate();
2904
+ return [start, end];
2905
+ },
2906
+ },
2907
+ };
2908
+
2909
+ /* TekTreeGrid Class */
2910
+ class TekTreeGrid extends common.TreeGridEditable {
2911
+ /**
2912
+ * TekTreeGrid class constructor
2913
+ * @param props TekTreeGrid properties
2914
+ */
2915
+ constructor(props) {
2916
+ super(props);
2917
+ /* Grid Title */
2918
+ this.title = '';
2919
+ /* Show Add button */
2920
+ this.addButton = false;
2921
+ /* Show Delete button */
2922
+ this.deleteButton = 'none';
2923
+ /* Show Delete button */
2924
+ this.actions = [];
2925
+ /* Show Filter button */
2926
+ this.filterButton = false;
2927
+ /* Show Column Filter button */
2928
+ this.columnFilterButton = false;
2929
+ /* Show Columns button */
2930
+ this.columnsButton = false;
2931
+ /* Columns to be ignored on columns button */
2932
+ this.columnsButtonIgnore = [];
2933
+ /**
2934
+ * Enables column dragging
2935
+ * @public
2936
+ */
2937
+ this.dragColumns = true;
2938
+ /**
2939
+ * Enables column resizing
2940
+ * @public
2941
+ */
2942
+ this.resizeColumns = true;
2943
+ /**
2944
+ * Enables layout saving
2945
+ * @public
2946
+ */
2947
+ this.showLayoutOptions = true;
2948
+ /**
2949
+ * Show export button
2950
+ */
2951
+ this.showExport = false;
2952
+ /**
2953
+ * Show refresh button
2954
+ */
2955
+ this.showReload = true;
2956
+ /**
2957
+ * Export config
2958
+ */
2959
+ this.exportConfig = [
2960
+ {
2961
+ type: 'pdf',
2962
+ label: core.I18n.translate('TEKGRID_EXPORT_AS', { type: 'PDF' }),
2963
+ },
2964
+ {
2965
+ type: 'xls',
2966
+ label: core.I18n.translate('TEKGRID_EXPORT_AS', { type: 'XLS' }),
2967
+ },
2968
+ {
2969
+ type: 'csv',
2970
+ label: core.I18n.translate('TEKGRID_EXPORT_AS', { type: 'CSV' }),
2971
+ },
2972
+ ];
2973
+ this.toolbarSlotProps = false;
2974
+ this.title = this.getInitValue('title', props.title, this.title);
2975
+ this.addButton = this.getInitValue('addButton', props.addButton, this.addButton);
2976
+ this.deleteButton = this.getInitValue('deleteButton', props.deleteButton, this.deleteButton);
2977
+ this.filterButton = this.getInitValue('filterButton', props.filterButton, this.filterButton);
2978
+ this.columnFilterButton = this.getInitValue('columnFilterButton', props.columnFilterButton, this.columnFilterButton);
2979
+ this.columnsButton = this.getInitValue('columnsButton', props.columnsButton, this.columnsButton);
2980
+ this.columnsButtonIgnore = this.getInitValue('columnsButtonIgnore', props.columnsButtonIgnore, this.columnsButtonIgnore);
2981
+ this.dragColumns = this.getInitValue('dragColumns', props.dragColumns, this.dragColumns);
2982
+ this.resizeColumns = this.getInitValue('resizeColumns', props.resizeColumns, this.resizeColumns);
2983
+ this.showLayoutOptions = this.getInitValue('showLayoutOptions', props.showLayoutOptions, this.showLayoutOptions);
2984
+ this.showExport = this.getInitValue('showExport', props.showExport, this.showExport);
2985
+ this.showReload = this.getInitValue('showReload', props.showReload, this.showReload);
2986
+ this.exportConfig = this.getInitValue('exportConfig', props.exportConfig, this.exportConfig);
2987
+ this.exportActions = props.exportActions || this.exportActions;
2988
+ this.actions = props.actions || this.actions;
2989
+ this.toolbarSlotProps = props.toolbarSlot !== undefined;
2990
+ if (this.deleteButton === 'selection') {
2991
+ this.selectable = true;
2992
+ }
2993
+ this.gridBase = new GridBase(this);
2994
+ this.filterOperationsDatasource = this.gridBase.getFilterOperationsDatasource();
2995
+ this.filterRelationsDatasource = this.gridBase.getFilterRelationsDatasource();
2996
+ this.createAccessors();
2997
+ }
2998
+ onCreated() {
2999
+ super.onCreated();
3000
+ core.Loader.addController(`GridController_${this.componentId}`, new GridController(this));
3001
+ if (!this.toolbarSlotProps)
3002
+ this.toolbarSlot = this.gridBase.createToolbarProps();
3003
+ }
3004
+ /**
3005
+ * Get Grid columns objects
3006
+ * @param columns Grid columns parameter
3007
+ */
3008
+ getColumns(columns) {
3009
+ return columns.map((column) => new TekGridColumn(column, this));
3010
+ }
3011
+ columnHasFilterData(column) {
3012
+ if (this.datasource instanceof TekRestDatasource || this.datasource instanceof TekMemoryDatasource) {
3013
+ const dynamicFilter = this.datasource.dynamicFilter[column.name];
3014
+ return dynamicFilter && dynamicFilter.length > 0;
3015
+ }
3016
+ return this.datasource.filter[column.name];
3017
+ }
3018
+ getReport(type, portrait, rowObj = {}) {
3019
+ return __awaiter(this, void 0, void 0, function* () {
3020
+ const report = new common.Report(this, this.title);
3021
+ const reportGroups = {};
3022
+ const reportAggregations = {};
3023
+ let filter;
3024
+ if (this.datasource instanceof TekRestDatasource || this.datasource instanceof TekMemoryDatasource) {
3025
+ const reportFilter = new ReportFilter(this.datasource.dynamicFilter);
3026
+ filter = reportFilter.build();
3027
+ }
3028
+ return report.getReport(type, portrait, {
3029
+ metaData: merge__default["default"](rowObj, {
3030
+ filter,
3031
+ groups: reportGroups,
3032
+ columns: reportAggregations,
3033
+ }),
3034
+ }).then((reportUrl) => window.open(reportUrl));
3035
+ });
3036
+ }
3037
+ setSearch(search) {
3038
+ return __awaiter(this, void 0, void 0, function* () {
3039
+ return this.gridBase.setSearch(search);
3040
+ });
3041
+ }
3042
+ /**
3043
+ * Dispatches row click event
3044
+ * @param row Grid row
3045
+ * @param event DOM event
3046
+ * @param element DOM Element
3047
+ */
3048
+ rowClick(row, event, element) {
3049
+ if (!this.preventRowClick) {
3050
+ this.datasource.currentRow = row;
3051
+ this.callEvent('rowClick', {
3052
+ event, element, row, component: this, column: undefined,
3053
+ });
3054
+ }
3055
+ this.preventRowClick = false;
3056
+ }
3057
+ }
3058
+
2598
3059
  core.Messages.add({
2599
3060
  'pt-BR': {
2600
3061
  translation: {
@@ -2656,14 +3117,17 @@
2656
3117
  exports.Image = Image;
2657
3118
  exports.IterableCarousel = IterableCarousel;
2658
3119
  exports.IterableComponentRender = IterableComponentRender;
3120
+ exports.Loading = Loading;
2659
3121
  exports.Notifications = Notifications;
2660
3122
  exports.ProductCard = ProductCard;
3123
+ exports.TekFilterHelper = TekFilterHelper;
2661
3124
  exports.TekGrid = TekGrid;
2662
3125
  exports.TekGridColumn = TekGridColumn;
2663
3126
  exports.TekGridColumnsButton = TekGridColumnsButton;
2664
3127
  exports.TekGridLayoutOptions = TekGridLayoutOptions;
2665
3128
  exports.TekMemoryDatasource = TekMemoryDatasource;
2666
3129
  exports.TekRestDatasource = TekRestDatasource;
3130
+ exports.TekTreeGrid = TekTreeGrid;
2667
3131
  exports.columnAggregationValues = columnAggregationValues;
2668
3132
 
2669
3133
  Object.defineProperty(exports, '__esModule', { value: true });