@revolist/revogrid 4.24.2 → 4.25.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 (124) hide show
  1. package/dist/cjs/app-globals-Dmf-wvGw.js +8 -0
  2. package/dist/cjs/{cell-renderer-DnOCJ9ge.js → cell-renderer-Cf2Pu4S0.js} +3 -3
  3. package/dist/cjs/{column.drag.plugin-DSiFObaj.js → column.drag.plugin-E_K6cIAy.js} +101 -13
  4. package/dist/cjs/{column.service-CD70rNL2.js → column.service-C7p5eC5V.js} +1 -1
  5. package/dist/cjs/{dimension.helpers-CB5sNw5J.js → dimension.helpers-CgHhnN1d.js} +1 -1
  6. package/dist/cjs/{edit.utils-DDxnq9lw.js → edit.utils-rAcGublN.js} +1 -1
  7. package/dist/cjs/{filter.button-C4xpvyyE.js → filter.button-F2Bw3UAd.js} +1 -1
  8. package/dist/cjs/{header-cell-renderer-JXYFwayd.js → header-cell-renderer-DHClfIto.js} +2 -2
  9. package/dist/cjs/{index-BF6JDcMr.js → index--FdNLz1Z.js} +1 -1
  10. package/dist/cjs/{index-Dq8Xzj5l.js → index-DRvxCueo.js} +61 -20
  11. package/dist/cjs/index.cjs.js +556 -47
  12. package/dist/cjs/loader.cjs.js +3 -4
  13. package/dist/cjs/revo-grid.cjs.entry.js +256 -28
  14. package/dist/cjs/revo-grid.cjs.js +4 -5
  15. package/dist/cjs/revogr-attribution_7.cjs.entry.js +9 -9
  16. package/dist/cjs/revogr-clipboard_3.cjs.entry.js +6 -6
  17. package/dist/cjs/revogr-data_4.cjs.entry.js +8 -8
  18. package/dist/cjs/revogr-filter-panel.cjs.entry.js +19 -6
  19. package/dist/cjs/{text-editor-CvgloQdG.js → text-editor-F04kTx53.js} +2 -2
  20. package/dist/cjs/{viewport.store-Ci8H1bI9.js → viewport.store-B4Clk4m9.js} +1 -1
  21. package/dist/collection/collection-manifest.json +2 -3
  22. package/dist/collection/components/editors/revogr-edit-style.css +2 -2
  23. package/dist/collection/components/header/revogr-header-style.css +2 -2
  24. package/dist/collection/components/overlay/revogr-overlay-style.css +9 -6
  25. package/dist/collection/components/revoGrid/revo-grid-style.css +451 -276
  26. package/dist/collection/components/revoGrid/revo-grid.js +106 -35
  27. package/dist/collection/components/scroll/revogr-viewport-scroll-style.css +6 -4
  28. package/dist/collection/components/selectionFocus/revogr-focus-style.css +1 -1
  29. package/dist/collection/components/selectionTempRange/revogr-temp-range-style.css +2 -2
  30. package/dist/collection/index.js +1 -0
  31. package/dist/collection/plugins/filter/filter.panel.js +36 -3
  32. package/dist/collection/plugins/filter/filter.plugin.js +21 -6
  33. package/dist/collection/plugins/filter/filter.style.css +43 -38
  34. package/dist/collection/serve/controller.js +18 -2
  35. package/dist/collection/themeManager/presets/aurora.js +89 -0
  36. package/dist/collection/themeManager/presets/high-contrast-dark.js +89 -0
  37. package/dist/collection/themeManager/presets/high-contrast.js +89 -0
  38. package/dist/collection/themeManager/presets/index.js +25 -0
  39. package/dist/collection/themeManager/presets/midnight.js +89 -0
  40. package/dist/collection/themeManager/presets/ocean.js +89 -0
  41. package/dist/collection/themeManager/presets/shared.js +64 -0
  42. package/dist/collection/themeManager/theme.service.js +141 -20
  43. package/dist/collection/types/theme.js +73 -1
  44. package/dist/esm/app-globals-CA4dvSNd.js +6 -0
  45. package/dist/{revo-grid/cell-renderer-BQjko1zB.js → esm/cell-renderer-11cf-lu3.js} +3 -3
  46. package/dist/{revo-grid/column.drag.plugin-Cf9DYdQj.js → esm/column.drag.plugin-DKgC_0I1.js} +100 -14
  47. package/dist/esm/{column.service-BnFqXqQG.js → column.service-Cfw3L0PN.js} +1 -1
  48. package/dist/esm/{dimension.helpers-CXrsUc6f.js → dimension.helpers-fl4HSSK9.js} +1 -1
  49. package/dist/esm/{edit.utils-CXmmCnxE.js → edit.utils-4e9fsqOR.js} +1 -1
  50. package/dist/esm/{filter.button-B-RBiF67.js → filter.button-DMhpuAiw.js} +1 -1
  51. package/dist/esm/{header-cell-renderer-B3mYpZD3.js → header-cell-renderer-Cqtg1ETB.js} +2 -2
  52. package/dist/esm/{index-Chp_81rd.js → index-CtimkLsB.js} +62 -20
  53. package/dist/esm/{index-DBqlJITb.js → index-D24ku9ej.js} +1 -1
  54. package/dist/esm/index.js +513 -13
  55. package/dist/esm/loader.js +4 -5
  56. package/dist/esm/revo-grid.entry.js +255 -27
  57. package/dist/esm/revo-grid.js +5 -6
  58. package/dist/esm/revogr-attribution_7.entry.js +9 -9
  59. package/dist/esm/revogr-clipboard_3.entry.js +6 -6
  60. package/dist/esm/revogr-data_4.entry.js +8 -8
  61. package/dist/esm/revogr-filter-panel.entry.js +19 -6
  62. package/dist/{revo-grid/text-editor-DQtz2Y7B.js → esm/text-editor-DlMnLkRK.js} +2 -2
  63. package/dist/{revo-grid/viewport.store-D5jEuhLq.js → esm/viewport.store-BSXmsiZc.js} +1 -1
  64. package/dist/revo-grid/app-globals-CA4dvSNd.js +6 -0
  65. package/dist/{esm/cell-renderer-BQjko1zB.js → revo-grid/cell-renderer-11cf-lu3.js} +3 -3
  66. package/dist/{esm/column.drag.plugin-Cf9DYdQj.js → revo-grid/column.drag.plugin-DKgC_0I1.js} +100 -14
  67. package/dist/revo-grid/{column.service-BnFqXqQG.js → column.service-Cfw3L0PN.js} +1 -1
  68. package/dist/revo-grid/{dimension.helpers-CXrsUc6f.js → dimension.helpers-fl4HSSK9.js} +1 -1
  69. package/dist/revo-grid/{edit.utils-CXmmCnxE.js → edit.utils-4e9fsqOR.js} +1 -1
  70. package/dist/revo-grid/{filter.button-B-RBiF67.js → filter.button-DMhpuAiw.js} +1 -1
  71. package/dist/revo-grid/{header-cell-renderer-B3mYpZD3.js → header-cell-renderer-Cqtg1ETB.js} +2 -2
  72. package/dist/revo-grid/{index-Chp_81rd.js → index-CtimkLsB.js} +62 -20
  73. package/dist/revo-grid/{index-DBqlJITb.js → index-D24ku9ej.js} +1 -1
  74. package/dist/revo-grid/index.esm.js +513 -13
  75. package/dist/revo-grid/revo-grid.entry.js +255 -27
  76. package/dist/revo-grid/revo-grid.esm.js +5 -6
  77. package/dist/revo-grid/revogr-attribution_7.entry.js +9 -9
  78. package/dist/revo-grid/revogr-clipboard_3.entry.js +6 -6
  79. package/dist/revo-grid/revogr-data_4.entry.js +8 -8
  80. package/dist/revo-grid/revogr-filter-panel.entry.js +19 -6
  81. package/dist/{esm/text-editor-DQtz2Y7B.js → revo-grid/text-editor-DlMnLkRK.js} +2 -2
  82. package/dist/{esm/viewport.store-D5jEuhLq.js → revo-grid/viewport.store-BSXmsiZc.js} +1 -1
  83. package/dist/types/components/revoGrid/revo-grid.d.ts +16 -4
  84. package/dist/types/components.d.ts +28 -7
  85. package/dist/types/index.d.ts +1 -0
  86. package/dist/types/plugins/filter/filter.panel.d.ts +4 -0
  87. package/dist/types/plugins/filter/filter.plugin.d.ts +1 -0
  88. package/dist/types/plugins/filter/filter.types.d.ts +5 -0
  89. package/dist/types/stencil-public-runtime.d.ts +1 -0
  90. package/dist/types/themeManager/presets/aurora.d.ts +8 -0
  91. package/dist/types/themeManager/presets/high-contrast-dark.d.ts +8 -0
  92. package/dist/types/themeManager/presets/high-contrast.d.ts +8 -0
  93. package/dist/types/themeManager/presets/index.d.ts +33 -0
  94. package/dist/types/themeManager/presets/midnight.d.ts +8 -0
  95. package/dist/types/themeManager/presets/ocean.d.ts +8 -0
  96. package/dist/types/themeManager/presets/shared.d.ts +81 -0
  97. package/dist/types/themeManager/theme.service.d.ts +9 -6
  98. package/dist/types/types/theme.d.ts +88 -1
  99. package/hydrate/index.js +1307 -597
  100. package/hydrate/index.mjs +1307 -597
  101. package/package.json +4 -4
  102. package/standalone/index.js +1 -1
  103. package/standalone/revo-grid.js +1 -1
  104. package/standalone/revogr-edit2.js +1 -1
  105. package/standalone/revogr-filter-panel.js +1 -1
  106. package/standalone/revogr-focus2.js +1 -1
  107. package/standalone/revogr-header2.js +1 -1
  108. package/standalone/revogr-overlay-selection2.js +1 -1
  109. package/standalone/revogr-temp-range2.js +1 -1
  110. package/standalone/revogr-viewport-scroll2.js +1 -1
  111. package/dist/cjs/app-globals-CPPhEXmy.js +0 -26
  112. package/dist/cjs/theme.service-BgnxGIjK.js +0 -72
  113. package/dist/collection/global/global.js +0 -18
  114. package/dist/collection/themeManager/theme.compact.js +0 -8
  115. package/dist/collection/themeManager/theme.default.js +0 -8
  116. package/dist/collection/themeManager/theme.material.js +0 -8
  117. package/dist/esm/app-globals-B_B_OtEa.js +0 -24
  118. package/dist/esm/theme.service-BmnDvr6P.js +0 -69
  119. package/dist/revo-grid/app-globals-B_B_OtEa.js +0 -24
  120. package/dist/revo-grid/theme.service-BmnDvr6P.js +0 -69
  121. package/dist/types/global/global.d.ts +0 -1
  122. package/dist/types/themeManager/theme.compact.d.ts +0 -4
  123. package/dist/types/themeManager/theme.default.d.ts +0 -4
  124. package/dist/types/themeManager/theme.material.d.ts +0 -4
@@ -7,7 +7,8 @@ import { DataProvider } from "../../services/data.provider";
7
7
  import { getVisibleSourceItem, rowTypes } from "../../store/index";
8
8
  import DimensionProvider from "../../services/dimension.provider";
9
9
  import ViewportProvider from "../../services/viewport.provider";
10
- import ThemeService from "../../themeManager/theme.service";
10
+ import ThemeService, { getTheme } from "../../themeManager/theme.service";
11
+ import { themeTokenCssVariables } from "../../types/theme";
11
12
  import { timeout } from "../../utils";
12
13
  import { AutoSizeColumnPlugin, } from "../../plugins/column.auto-size.plugin";
13
14
  import { FilterPlugin, } from "../../plugins/filter/filter.plugin";
@@ -28,6 +29,10 @@ import { getColumnByProp, getColumns } from "../../utils/column.utils";
28
29
  import { WCAGPlugin } from "../../plugins/wcag";
29
30
  import { PluginService } from "./plugin.service";
30
31
  import { RTLPlugin } from "../../plugins/rtl/rtl.plugin";
32
+ const DEFAULT_COLUMN_SIZE = 100;
33
+ function getColumnSize(size) {
34
+ return Number.isFinite(size) && size > 0 ? size : DEFAULT_COLUMN_SIZE;
35
+ }
31
36
  /**
32
37
  * Revogrid - High-performance, customizable grid library for managing large datasets.
33
38
  * ### Events guide
@@ -119,6 +124,11 @@ export class RevoGridComponent {
119
124
  this.columnTypes = {};
120
125
  /** Theme name. */
121
126
  this.theme = 'default';
127
+ /**
128
+ * Per-grid custom theme definitions.
129
+ * Assign as a JavaScript property; complex values cannot be serialized as HTML attributes.
130
+ */
131
+ this.themeDefinitions = [];
122
132
  /**
123
133
  * Row class property mapping.
124
134
  * Map custom classes to rows from row object data.
@@ -218,6 +228,7 @@ export class RevoGridComponent {
218
228
  this.pluginService = new PluginService();
219
229
  this.viewport = null;
220
230
  this.isInited = false;
231
+ this.themeStyles = {};
221
232
  }
222
233
  // #endregion
223
234
  // #region Methods
@@ -716,29 +727,70 @@ export class RevoGridComponent {
716
727
  this.refreshColumnsOnConfigChange(newVal, prevVal);
717
728
  }
718
729
  rowSizeChanged(s) {
719
- if (!this.dimensionProvider) {
730
+ if (!this.themeService || !this.dimensionProvider) {
731
+ return;
732
+ }
733
+ this.themeService.rowSize = s;
734
+ this.applyTheme(this.theme, false, false, 'rowSize');
735
+ }
736
+ colSizeChanged(s) {
737
+ if (!this.dimensionProvider || !this.columnProvider) {
720
738
  return;
721
739
  }
722
- // clear existing data
723
- this.dimensionProvider.setSettings({ originItemSize: s }, 'rgRow');
724
- this.rowDefChanged(this.rowDefinitions, this.rowDefinitions, 'rowSize', true);
740
+ this.dimensionProvider.setSettings({ originItemSize: getColumnSize(s) }, 'rgCol');
741
+ this.columnChanged(this.columns);
725
742
  }
726
743
  themeChanged(t, _, __ = 'theme', init = false) {
727
- if (!this.dimensionProvider) {
744
+ if (!this.themeService || !this.dimensionProvider) {
745
+ return;
746
+ }
747
+ if (this.pendingNormalizedTheme === t) {
748
+ this.pendingNormalizedTheme = undefined;
749
+ return;
750
+ }
751
+ const normalizedTheme = getTheme(t);
752
+ if (normalizedTheme !== t) {
753
+ this.pendingNormalizedTheme = normalizedTheme;
754
+ this.theme = normalizedTheme;
755
+ }
756
+ this.applyTheme(normalizedTheme, init, true, 'theme');
757
+ }
758
+ themeDefinitionsChanged(definitions = []) {
759
+ if (!this.themeService || !this.dimensionProvider) {
728
760
  return;
729
761
  }
730
- this.themeService.register(t);
731
- this.dimensionProvider.setSettings({ originItemSize: this.themeService.rowSize }, 'rgRow');
732
- this.dimensionProvider.setSettings({ originItemSize: this.colSize }, 'rgCol');
733
- // if theme change we need to reapply row size and reset viewport
734
- if (!init) {
735
- // clear existing data
736
- this.dimensionProvider.setSettings({ originItemSize: this.themeService.rowSize }, 'rgRow');
737
- this.rowDefChanged(
738
- // for cases when some custom size present and not
739
- this.rowDefinitions, this.rowDefinitions, 'theme', true);
762
+ this.themeService.setDefinitions(definitions);
763
+ this.applyTheme(this.theme, false, true, 'themeDefinitions');
764
+ }
765
+ applyTheme(theme, init, emitEvent, reason) {
766
+ var _a;
767
+ const resolvedTheme = this.themeService.register(theme);
768
+ const rowSize = this.themeService.rowSize;
769
+ const densityChanged = this.appliedThemeRowSize !== rowSize;
770
+ const hadAppliedTheme = this.appliedThemeRowSize !== undefined;
771
+ this.appliedThemeRowSize = rowSize;
772
+ this.themeStyles = this.getThemeStyles();
773
+ if (densityChanged) {
774
+ (_a = this.dimensionProvider) === null || _a === void 0 ? void 0 : _a.setSettings({ originItemSize: rowSize }, 'rgRow');
775
+ if (!init && hadAppliedTheme) {
776
+ this.rowDefChanged(this.rowDefinitions, this.rowDefinitions, reason, true);
777
+ }
778
+ }
779
+ if (emitEvent) {
780
+ this.afterthemechanged.emit(resolvedTheme.name);
781
+ }
782
+ }
783
+ getThemeStyles() {
784
+ const styles = {
785
+ '--rg-theme-row-size': `${this.themeService.rowSize}px`,
786
+ };
787
+ for (const [name, value] of Object.entries(this.themeService.theme.tokens)) {
788
+ const cssVariable = themeTokenCssVariables[name];
789
+ if (cssVariable && value) {
790
+ styles[cssVariable] = value;
791
+ }
740
792
  }
741
- this.afterthemechanged.emit(t);
793
+ return styles;
742
794
  }
743
795
  dataSourceChanged(newVal = [], _, watchName) {
744
796
  if (!this.dataProvider) {
@@ -975,9 +1027,11 @@ export class RevoGridComponent {
975
1027
  this.themeService = new ThemeService({
976
1028
  rowSize: this.rowSize,
977
1029
  });
1030
+ this.themeService.setDefinitions(this.themeDefinitions);
978
1031
  this.dimensionProvider = new DimensionProvider(this.viewportProvider, {
979
1032
  realSizeChanged: (k) => this.contentsizechanged.emit(k),
980
1033
  });
1034
+ this.dimensionProvider.setSettings({ originItemSize: getColumnSize(this.colSize) }, 'rgCol');
981
1035
  this.columnProvider = new ColumnDataProvider();
982
1036
  this.selectionStoreConnector = new SelectionStoreConnector();
983
1037
  this.dataProvider = new DataProvider(this.dimensionProvider);
@@ -1095,7 +1149,7 @@ export class RevoGridComponent {
1095
1149
  const dimensions = this.dimensionProvider.stores;
1096
1150
  const verticalScroll = (h("revogr-scroll-virtual", { class: "vertical", dimension: typeRow, clientSize: viewports[typeRow].store.get('clientSize'), virtualSize: viewports[typeRow].store.get('virtualSize'), realSize: dimensions[typeRow].store.get('realSize'), ref: el => this.scrollingService.registerElement(el, 'rowScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }));
1097
1151
  const horizontalScroll = (h("revogr-scroll-virtual", { class: "horizontal", dimension: typeCol, clientSize: viewports[typeCol].store.get('clientSize'), virtualSize: viewports[typeCol].store.get('virtualSize'), realSize: dimensions[typeCol].store.get('realSize'), ref: el => this.scrollingService.registerElement(el, 'colScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }));
1098
- return (h(Host, { dir: this.rtl ? 'rtl' : 'ltr' }, this.hideAttribution ? null : (h("revogr-attribution", { class: "attribution" })), h("slot", { name: "header" }), h("div", { class: "main-viewport", onClick: (e) => {
1152
+ return (h(Host, { dir: this.rtl ? 'rtl' : 'ltr', "data-rg-theme-base": this.themeService.theme.base, "data-rg-theme-scheme": this.themeService.theme.colorScheme, style: this.themeStyles }, this.hideAttribution ? null : (h("revogr-attribution", { class: "attribution" })), h("slot", { name: "header" }), h("div", { class: "main-viewport", onClick: (e) => {
1099
1153
  var _a;
1100
1154
  if (e.currentTarget === e.target) {
1101
1155
  (_a = this.viewport) === null || _a === void 0 ? void 0 : _a.clearEdit();
@@ -1563,14 +1617,34 @@ export class RevoGridComponent {
1563
1617
  "type": "string",
1564
1618
  "mutable": true,
1565
1619
  "complexType": {
1566
- "original": "Theme",
1620
+ "original": "string",
1567
1621
  "resolved": "string",
1622
+ "references": {}
1623
+ },
1624
+ "required": false,
1625
+ "optional": false,
1626
+ "docs": {
1627
+ "tags": [],
1628
+ "text": "Theme name."
1629
+ },
1630
+ "getter": false,
1631
+ "setter": false,
1632
+ "reflect": true,
1633
+ "attribute": "theme",
1634
+ "defaultValue": "'default'"
1635
+ },
1636
+ "themeDefinitions": {
1637
+ "type": "unknown",
1638
+ "mutable": false,
1639
+ "complexType": {
1640
+ "original": "ThemeDefinition[]",
1641
+ "resolved": "ThemeDefinition[]",
1568
1642
  "references": {
1569
- "Theme": {
1643
+ "ThemeDefinition": {
1570
1644
  "location": "import",
1571
1645
  "path": "@type",
1572
- "id": "src/types/index.ts::Theme",
1573
- "referenceLocation": "Theme"
1646
+ "id": "src/types/index.ts::ThemeDefinition",
1647
+ "referenceLocation": "ThemeDefinition"
1574
1648
  }
1575
1649
  }
1576
1650
  },
@@ -1578,13 +1652,11 @@ export class RevoGridComponent {
1578
1652
  "optional": false,
1579
1653
  "docs": {
1580
1654
  "tags": [],
1581
- "text": "Theme name."
1655
+ "text": "Per-grid custom theme definitions.\nAssign as a JavaScript property; complex values cannot be serialized as HTML attributes."
1582
1656
  },
1583
1657
  "getter": false,
1584
1658
  "setter": false,
1585
- "reflect": true,
1586
- "attribute": "theme",
1587
- "defaultValue": "'default'"
1659
+ "defaultValue": "[]"
1588
1660
  },
1589
1661
  "rowClass": {
1590
1662
  "type": "string",
@@ -2936,16 +3008,9 @@ export class RevoGridComponent {
2936
3008
  "text": "Emmited after the theme is changed"
2937
3009
  },
2938
3010
  "complexType": {
2939
- "original": "Theme",
3011
+ "original": "string",
2940
3012
  "resolved": "string",
2941
- "references": {
2942
- "Theme": {
2943
- "location": "import",
2944
- "path": "@type",
2945
- "id": "src/types/index.ts::Theme",
2946
- "referenceLocation": "Theme"
2947
- }
2948
- }
3013
+ "references": {}
2949
3014
  }
2950
3015
  }, {
2951
3016
  "method": "created",
@@ -3732,9 +3797,15 @@ export class RevoGridComponent {
3732
3797
  }, {
3733
3798
  "propName": "rowSize",
3734
3799
  "methodName": "rowSizeChanged"
3800
+ }, {
3801
+ "propName": "colSize",
3802
+ "methodName": "colSizeChanged"
3735
3803
  }, {
3736
3804
  "propName": "theme",
3737
3805
  "methodName": "themeChanged"
3806
+ }, {
3807
+ "propName": "themeDefinitions",
3808
+ "methodName": "themeDefinitionsChanged"
3738
3809
  }, {
3739
3810
  "propName": "source",
3740
3811
  "methodName": "dataSourceChanged"
@@ -17,6 +17,12 @@ revogr-viewport-scroll {
17
17
  -ms-overflow-style: none;
18
18
  scrollbar-width: none; /* Firefox */
19
19
  /* Hide scrollbar for Chrome, Safari and Opera */
20
+ }
21
+ revogr-viewport-scroll::-webkit-scrollbar {
22
+ display: none;
23
+ -webkit-appearance: none;
24
+ }
25
+ revogr-viewport-scroll {
20
26
  overflow-x: auto;
21
27
  overflow-y: hidden;
22
28
  overscroll-behavior-x: contain;
@@ -24,10 +30,6 @@ revogr-viewport-scroll {
24
30
  z-index: 1;
25
31
  height: 100%;
26
32
  }
27
- revogr-viewport-scroll::-webkit-scrollbar {
28
- display: none;
29
- -webkit-appearance: none;
30
- }
31
33
  revogr-viewport-scroll.colPinStart, revogr-viewport-scroll.colPinEnd {
32
34
  z-index: 2;
33
35
  }
@@ -1,5 +1,5 @@
1
1
  revogr-focus.focused-cell {
2
- box-shadow: -1px 0 0 #0d63e8 inset, 1px 0 0 #0d63e8 inset, 0 -1px 0 #0d63e8 inset, 0 1px 0 #0d63e8 inset;
2
+ box-shadow: -1px 0 0 var(--rg-theme-selection-border) inset, 1px 0 0 var(--rg-theme-selection-border) inset, 0 -1px 0 var(--rg-theme-selection-border) inset, 0 1px 0 var(--rg-theme-selection-border) inset;
3
3
  position: absolute;
4
4
  pointer-events: none;
5
5
  z-index: 9;
@@ -3,11 +3,11 @@
3
3
  position: absolute;
4
4
  pointer-events: none;
5
5
  z-index: 9;
6
- border: 1px solid rgb(255, 94, 0);
6
+ border: 1px solid var(--rg-theme-temporary-range-border);
7
7
  box-sizing: border-box;
8
8
  }
9
9
  .temp-bg-range.Selection {
10
- border: 1px dashed gray;
10
+ border: 1px dashed var(--rg-theme-temporary-selection-border);
11
11
  }
12
12
  .temp-bg-range > div {
13
13
  width: 1px;
@@ -2,6 +2,7 @@
2
2
  * Built by Revolist OU ❤️
3
3
  */
4
4
  export * from './types';
5
+ export * from './themeManager/presets';
5
6
  export * from './store';
6
7
  export * from './plugins';
7
8
  export * from './components';
@@ -50,6 +50,10 @@ export class FilterPanel {
50
50
  * If true, closes the filter panel when clicking outside
51
51
  */
52
52
  this.closeOnOutsideClick = true;
53
+ /**
54
+ * Whether the filter panel allows the same operator more than once per column.
55
+ */
56
+ this.allowDuplicateOperators = true;
53
57
  this.debouncedApplyFilter = debounce(() => {
54
58
  this.filterChange.emit(this.filterItems);
55
59
  }, 400);
@@ -363,11 +367,15 @@ export class FilterPanel {
363
367
  }
364
368
  }
365
369
  renderSelectOptions(type, isDefaultTypeRemoved = false) {
370
+ var _a;
366
371
  if (!this.changes) {
367
372
  return;
368
373
  }
369
374
  const options = [];
370
375
  const prop = this.changes.prop;
376
+ if (prop === undefined) {
377
+ return;
378
+ }
371
379
  const hidden = new Set();
372
380
  Object.keys(this.filterItems).forEach((prop) => {
373
381
  const values = this.filterItems[prop];
@@ -377,6 +385,9 @@ export class FilterPanel {
377
385
  }
378
386
  });
379
387
  });
388
+ const selectedTypes = new Set(((_a = this.filterItems[prop]) !== null && _a !== void 0 ? _a : [])
389
+ .filter(filter => !filter.hidden)
390
+ .map(filter => filter.type));
380
391
  if (!isDefaultTypeRemoved) {
381
392
  const capts = Object.assign(Object.assign({}, this.filterCaptionsInternal), this.filterCaptions);
382
393
  options.push(h("option", { selected: this.currentFilterType === defaultType, value: defaultType }, prop && this.filterItems[prop] && this.filterItems[prop].length > 0
@@ -384,7 +395,9 @@ export class FilterPanel {
384
395
  : this.filterNames[defaultType]));
385
396
  }
386
397
  for (let gIndex in this.changes.filterTypes) {
387
- const group = this.changes.filterTypes[gIndex].filter(k => !hidden.has(k));
398
+ const group = this.changes.filterTypes[gIndex].filter(k => !hidden.has(k) && (this.allowDuplicateOperators ||
399
+ !selectedTypes.has(k) ||
400
+ (isDefaultTypeRemoved && type === k)));
388
401
  if (group.length) {
389
402
  options.push(...group.map(k => (h("option", { value: k, selected: type === k }, this.filterNames[k]))));
390
403
  options.push(h("option", { disabled: true }));
@@ -479,7 +492,7 @@ export class FilterPanel {
479
492
  top: `${(_d = (_c = this.changes) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : 0}px`,
480
493
  };
481
494
  const capts = Object.assign(Object.assign({}, this.filterCaptionsInternal), this.filterCaptions);
482
- return (h(Host, { key: '2a19b35adb56fb7d23385fffebc768838edee162' }, h("dialog", { key: '94386d7cbc4bd9c631f72928938b1d1550a3de82', class: "filter-panel-dialog", style: style, ref: el => (this.dialog = el), onCancel: e => {
495
+ return (h(Host, { key: '8859c452eb08838f65f18efecbdde7f65fda2b49' }, h("dialog", { key: 'f603067ff0986a9f344cbbf816388d2bbac198bb', class: "filter-panel-dialog", style: style, ref: el => (this.dialog = el), onCancel: e => {
483
496
  e.preventDefault();
484
497
  this.onCancel();
485
498
  } }, this.changes && [
@@ -488,7 +501,7 @@ export class FilterPanel {
488
501
  ((_g = this.changes) === null || _g === void 0 ? void 0 : _g.hideDefaultFilters) !== true && [
489
502
  h("label", { key: "filter-title" }, capts.title),
490
503
  h("div", { key: "filter-holder", class: "filter-holder" }, this.getFilterItemsList()),
491
- h("div", { key: "add-filter", class: "add-filter" }, h("select", { key: '4f7354e39d8e5cf9ae7b735290eff18d105ab87e', id: FILTER_ID, class: "select-css", onChange: e => this.onAddNewFilter(e) }, this.renderSelectOptions(this.currentFilterType))),
504
+ h("div", { key: "add-filter", class: "add-filter" }, h("select", { key: '2ec0a66918edf91bdde3962b6ec84c89f6f1c8f1', id: FILTER_ID, class: "select-css", onChange: e => this.onAddNewFilter(e) }, this.renderSelectOptions(this.currentFilterType))),
492
505
  ],
493
506
  h("slot", { key: "default-slot" }),
494
507
  ((_j = (_h = this.changes).extraBottomContent) === null || _j === void 0 ? void 0 : _j.call(_h, this.changes)) || '',
@@ -634,6 +647,26 @@ export class FilterPanel {
634
647
  "reflect": false,
635
648
  "attribute": "close-on-outside-click",
636
649
  "defaultValue": "true"
650
+ },
651
+ "allowDuplicateOperators": {
652
+ "type": "boolean",
653
+ "mutable": false,
654
+ "complexType": {
655
+ "original": "boolean",
656
+ "resolved": "boolean",
657
+ "references": {}
658
+ },
659
+ "required": false,
660
+ "optional": false,
661
+ "docs": {
662
+ "tags": [],
663
+ "text": "Whether the filter panel allows the same operator more than once per column."
664
+ },
665
+ "getter": false,
666
+ "setter": false,
667
+ "reflect": false,
668
+ "attribute": "allow-duplicate-operators",
669
+ "defaultValue": "true"
637
670
  }
638
671
  };
639
672
  }
@@ -52,13 +52,14 @@ export class FilterPlugin extends BasePlugin {
52
52
  this.filterNameIndexByType = Object.assign({}, filterNames);
53
53
  this.filterFunctionsIndexedByType = Object.assign({}, filterCoreFunctionsIndexedByType);
54
54
  this.filterProp = FILTER_PROP;
55
+ this.allowDuplicateOperators = true;
55
56
  if (config) {
56
57
  this.initConfig(config);
57
58
  }
58
59
  const existingNodes = this.revogrid.registerVNode.filter(n => typeof n === 'object' && n.$tag$ !== FILTE_PANEL);
59
60
  this.revogrid.registerVNode = [
60
61
  ...existingNodes,
61
- h("revogr-filter-panel", { filterNames: this.filterNameIndexByType, filterEntities: this.filterFunctionsIndexedByType, filterCaptions: (_a = config === null || config === void 0 ? void 0 : config.localization) === null || _a === void 0 ? void 0 : _a.captions, onFilterChange: e => this.onFilterChange(e.detail), onResetChange: e => this.onFilterReset(e.detail), disableDynamicFiltering: config === null || config === void 0 ? void 0 : config.disableDynamicFiltering, closeOnOutsideClick: config === null || config === void 0 ? void 0 : config.closeFilterPanelOnOutsideClick, ref: e => (this.pop = e) }, ' ', this.extraContent()),
62
+ h("revogr-filter-panel", { filterNames: this.filterNameIndexByType, filterEntities: this.filterFunctionsIndexedByType, filterCaptions: (_a = config === null || config === void 0 ? void 0 : config.localization) === null || _a === void 0 ? void 0 : _a.captions, onFilterChange: e => this.onFilterChange(e.detail), onResetChange: e => this.onFilterReset(e.detail), disableDynamicFiltering: config === null || config === void 0 ? void 0 : config.disableDynamicFiltering, closeOnOutsideClick: config === null || config === void 0 ? void 0 : config.closeFilterPanelOnOutsideClick, allowDuplicateOperators: this.allowDuplicateOperators, ref: e => (this.pop = e) }, ' ', this.extraContent()),
62
63
  ];
63
64
  const aftersourceset = async () => {
64
65
  const filterCollectionProps = Object.keys(this.filterCollection);
@@ -85,15 +86,24 @@ export class FilterPlugin extends BasePlugin {
85
86
  };
86
87
  this.addEventListener('headerclick', e => this.headerclick(e));
87
88
  this.addEventListener(FILTER_CONFIG_CHANGED_EVENT, ({ detail }) => {
88
- if (!detail ||
89
- (typeof detail === 'object' &&
90
- (!detail.multiFilterItems ||
91
- !Object.keys(detail.multiFilterItems).length))) {
89
+ if (!detail) {
92
90
  this.clearFiltering();
93
91
  return;
94
92
  }
95
93
  if (typeof detail === 'object') {
96
- this.initConfig(detail);
94
+ const detailKeys = Object.keys(detail);
95
+ const preserveCurrentFilters = !detailKeys.includes('multiFilterItems') &&
96
+ detailKeys.includes('allowDuplicateOperators');
97
+ this.initConfig(preserveCurrentFilters
98
+ ? Object.assign(Object.assign({}, detail), { multiFilterItems: this.multiFilterItems }) : detail);
99
+ if (!detail.multiFilterItems || !Object.keys(detail.multiFilterItems).length) {
100
+ if (preserveCurrentFilters) {
101
+ aftersourceset();
102
+ return;
103
+ }
104
+ this.clearFiltering();
105
+ return;
106
+ }
97
107
  }
98
108
  aftersourceset();
99
109
  });
@@ -107,6 +117,11 @@ export class FilterPlugin extends BasePlugin {
107
117
  return null;
108
118
  }
109
119
  initConfig(config) {
120
+ var _a;
121
+ this.allowDuplicateOperators = (_a = config.allowDuplicateOperators) !== null && _a !== void 0 ? _a : true;
122
+ if (this.pop) {
123
+ this.pop.allowDuplicateOperators = this.allowDuplicateOperators;
124
+ }
110
125
  if (config.multiFilterItems) {
111
126
  this.multiFilterItems = Object.assign({}, config.multiFilterItems);
112
127
  }
@@ -1,8 +1,8 @@
1
1
  .revo-button {
2
2
  position: relative;
3
3
  overflow: hidden;
4
- color: #fff;
5
- background-color: #4545ff;
4
+ color: var(--rg-theme-button-text);
5
+ background-color: var(--rg-theme-button-bg);
6
6
  height: 32px;
7
7
  line-height: 32px;
8
8
  padding: 0 15px;
@@ -13,28 +13,23 @@
13
13
  cursor: pointer;
14
14
  }
15
15
  .revo-button.green {
16
- background-color: #009037;
16
+ background-color: var(--rg-theme-button-success-bg);
17
17
  }
18
18
  .revo-button.red {
19
- background-color: #E0662E;
19
+ background-color: var(--rg-theme-button-danger-bg);
20
20
  }
21
21
  .revo-button:disabled, .revo-button[disabled] {
22
22
  cursor: not-allowed !important;
23
23
  filter: opacity(0.35) !important;
24
24
  }
25
25
  .revo-button.outline {
26
- border: 1px solid #dbdbdb;
26
+ border: 1px solid var(--rg-theme-button-outline-border);
27
27
  line-height: 30px;
28
28
  background: none;
29
- color: #000;
29
+ color: var(--rg-theme-button-outline-text);
30
30
  box-shadow: none;
31
31
  }
32
32
 
33
- revo-grid[theme^=dark] .revo-button.outline {
34
- border: 1px solid #404040;
35
- color: #d8d8d8;
36
- }
37
-
38
33
  revogr-filter-panel {
39
34
  display: block;
40
35
  }
@@ -48,10 +43,11 @@ revogr-filter-panel .filter-panel-dialog {
48
43
  overflow: auto;
49
44
  opacity: 1;
50
45
  transform: none;
51
- background-color: var(--revo-grid-filter-panel-bg, #fff);
52
- border: 1px solid var(--revo-grid-filter-panel-border, #cecece);
46
+ color: var(--rg-theme-filter-panel-text);
47
+ background-color: var(--rg-theme-filter-panel-bg);
48
+ border: 1px solid var(--rg-theme-filter-panel-border);
53
49
  transform-origin: 62px 0px;
54
- box-shadow: 0 5px 18px -2px var(--revo-grid-filter-panel-shadow, rgba(0, 0, 0, 0.15));
50
+ box-shadow: 0 5px 18px -2px var(--rg-theme-filter-panel-shadow);
55
51
  box-sizing: border-box;
56
52
  padding: 10px;
57
53
  border-radius: 8px;
@@ -76,7 +72,8 @@ revogr-filter-panel .filter-panel-dialog input[type=text] {
76
72
  border: 0;
77
73
  min-height: 34px;
78
74
  margin: 5px 0;
79
- background: var(--revo-grid-filter-panel-input-bg, #f3f3f3);
75
+ color: var(--rg-theme-filter-panel-text);
76
+ background: var(--rg-theme-filter-panel-input-bg);
80
77
  border-radius: 5px;
81
78
  padding: 0 10px;
82
79
  box-sizing: border-box;
@@ -91,8 +88,8 @@ revogr-filter-panel .filter-panel-dialog .filter-actions {
91
88
  text-align: right;
92
89
  margin: 10px -10px -10px;
93
90
  padding: 0 5px 10px 10px;
94
- background: var(--revo-grid-filter-panel-bg, #fff);
95
- border-top: 1px solid var(--revo-grid-filter-panel-divider, #d9d9d9);
91
+ background: var(--rg-theme-filter-panel-bg);
92
+ border-top: 1px solid var(--rg-theme-filter-panel-divider);
96
93
  }
97
94
  revogr-filter-panel .filter-panel-dialog .filter-actions button {
98
95
  margin-top: 10px;
@@ -132,10 +129,10 @@ revogr-filter-panel .filter-panel-dialog .filter-actions button {
132
129
  border-radius: 4px;
133
130
  }
134
131
  .rgHeaderCell .rv-filter.active {
135
- color: #10224a;
132
+ color: var(--rg-theme-filter-panel-icon-active);
136
133
  }
137
134
  .rgHeaderCell .rv-filter .filter-img {
138
- color: gray;
135
+ color: var(--rg-theme-filter-panel-icon);
139
136
  width: 11px;
140
137
  }
141
138
 
@@ -148,44 +145,52 @@ revogr-filter-panel .filter-panel-dialog .filter-actions button {
148
145
  max-width: 100%; /* useful when width is set to anything other than 100% */
149
146
  box-sizing: border-box;
150
147
  margin: 0;
151
- border: 1px solid var(--revo-grid-filter-panel-select-border, #d9d9d9);
148
+ color: var(--rg-theme-filter-panel-text);
149
+ border: 1px solid var(--rg-theme-filter-panel-select-border);
152
150
  box-shadow: transparent;
153
151
  border-radius: 0.5em;
154
152
  appearance: none;
155
- background-color: var(--revo-grid-filter-panel-input-bg, #f3f3f3);
156
- background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23007CB2%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E");
153
+ background-color: var(--rg-theme-filter-panel-input-bg);
154
+ background-image: var(--revo-grid-filter-panel-select-arrow, url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23007CB2%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E"));
157
155
  background-repeat: no-repeat, repeat;
158
156
  /* arrow icon position (1em from the right, 50% vertical) , then gradient position*/
159
157
  background-position: right 0.7em top 50%, 0 0;
160
158
  /* icon size, then gradient */
161
159
  background-size: 0.65em auto, 100%;
162
160
  /* Hide arrow icon in IE browsers */
163
- /* Hover style */
164
- /* Focus style */
165
- /* Set options to normal weight */
166
- /* Disabled styles */
167
161
  }
168
162
  .select-css::-ms-expand {
169
163
  display: none;
170
164
  }
165
+ .select-css {
166
+ /* Hover style */
167
+ }
171
168
  .select-css:hover {
172
- border-color: var(--revo-grid-filter-panel-select-border, #d9d9d9);
169
+ border-color: var(--rg-theme-filter-panel-select-border);
170
+ }
171
+ .select-css {
172
+ /* Focus style */
173
173
  }
174
174
  .select-css:focus {
175
- border-color: var(--revo-grid-filter-panel-select-border-hover, #d9d9d9);
176
- box-shadow: 0 0 1px 3px rgba(59, 153, 252, 0.7);
177
- box-shadow: 0 0 0 3px -moz-mac-focusring;
175
+ border-color: var(--rg-theme-filter-panel-select-border-hover);
176
+ box-shadow: var(--rg-theme-filter-panel-focus-ring);
178
177
  outline: none;
179
178
  }
179
+ .select-css {
180
+ /* Set options to normal weight */
181
+ }
180
182
  .select-css option {
181
183
  font-weight: normal;
182
184
  }
185
+ .select-css {
186
+ /* Disabled styles */
187
+ }
183
188
  .select-css:disabled, .select-css[aria-disabled=true] {
184
- color: gray;
185
- background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E"), linear-gradient(to bottom, #ffffff 0%, #ffffff 100%);
189
+ color: var(--rg-theme-filter-panel-muted-text);
190
+ background-image: var(--revo-grid-filter-panel-select-arrow-disabled, url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22graytext%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E"));
186
191
  }
187
192
  .select-css:disabled:hover, .select-css[aria-disabled=true] {
188
- border-color: var(--revo-grid-filter-panel-select-border, #d9d9d9);
193
+ border-color: var(--rg-theme-filter-panel-select-border);
189
194
  }
190
195
 
191
196
  .multi-filter-list {
@@ -212,9 +217,9 @@ revogr-filter-panel .filter-panel-dialog .filter-actions button {
212
217
  left: 0;
213
218
  z-index: 2;
214
219
  height: 2px;
215
- background: var(--revo-grid-filter-panel-reorder-accent, #007cb2);
220
+ background: var(--rg-theme-filter-panel-reorder-accent);
216
221
  border-radius: 999px;
217
- box-shadow: 0 0 0 2px var(--revo-grid-filter-panel-bg, #fff);
222
+ box-shadow: 0 0 0 2px var(--rg-theme-filter-panel-bg);
218
223
  }
219
224
  .multi-filter-list .multi-filter-list-row.filter-row-drop-active .filter-row-drop-target {
220
225
  pointer-events: auto;
@@ -257,7 +262,7 @@ revogr-filter-panel .filter-panel-dialog .filter-actions button {
257
262
  .multi-filter-list .reorder-button {
258
263
  border: 0;
259
264
  background: transparent;
260
- color: var(--revo-grid-filter-panel-reorder-color, #6b7280);
265
+ color: var(--rg-theme-filter-panel-reorder-color);
261
266
  cursor: grab;
262
267
  font-family: monospace;
263
268
  font-size: 12px;
@@ -268,7 +273,7 @@ revogr-filter-panel .filter-panel-dialog .filter-actions button {
268
273
  width: 16px;
269
274
  }
270
275
  .multi-filter-list .reorder-button.filter-row-drag-over {
271
- color: var(--revo-grid-filter-panel-reorder-accent, #007cb2);
276
+ color: var(--rg-theme-filter-panel-reorder-accent);
272
277
  }
273
278
  .multi-filter-list .reorder-button:active {
274
279
  cursor: grabbing;
@@ -283,7 +288,7 @@ revogr-filter-panel .filter-panel-dialog .filter-actions button {
283
288
  .add-filter-divider {
284
289
  display: block;
285
290
  margin: 0 -10px 10px -10px;
286
- border-bottom: 1px solid var(--revo-grid-filter-panel-divider, #d9d9d9);
291
+ border-bottom: 1px solid var(--rg-theme-filter-panel-divider);
287
292
  height: 10px;
288
293
  }
289
294