Skip to content

Commit 8ab186c

Browse files
authored
Merge pull request #741 from revolist/#740
fix: #740 - recalculate viewport size on header and footer change
2 parents 6583874 + a4e5dca commit 8ab186c

7 files changed

Lines changed: 44 additions & 43 deletions

File tree

package-lock.json

Lines changed: 2 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@
104104
},
105105
"devDependencies": {
106106
"@angular/core": "^18.1.2",
107-
"@juggle/resize-observer": "^3.4.0",
108107
"@revolist/stencil-vue2-output-target": "^0.0.6",
109108
"@revolist/svelte-output-target": "0.0.6",
110109
"@stencil/angular-output-target": "0.8.4",
@@ -119,7 +118,6 @@
119118
"@types/node": "^20.14.2",
120119
"@types/react": "^18.3.3",
121120
"@types/react-dom": "^18.3.0",
122-
"@types/resize-observer-browser": "^0.1.11",
123121
"bootstrap": "^5.3.2",
124122
"chalk": "^5.3.0",
125123
"minimist": "^1.2.8",

src/components.d.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* It contains typing information for all components that exist in this project.
66
*/
77
import { HTMLStencilElement, JSXBase } from "@stencil/core/internal";
8-
import { AdditionalData, AfterEditEvent, AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeRowRenderEvent, BeforeSaveDataDetails, Cell, CellTemplateProp, ChangedRange, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionCols, DimensionRows, DimensionSettingsState, DimensionType, DimensionTypeCol, DragStartEvent, EditCell, EditorCtr, Editors, ElementScroll, ExtraNodeFuncConfig, FocusAfterRenderEvent, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, MultiDimensionType, Nullable, PluginBaseComponent, PositionItem, ProvidersColumns, RangeArea, RangeClipboardCopyEventProps, RangeClipboardPasteEvent, RowDefinition, RowDragStartDetails, RowHeaders, SaveDataDetails, SelectionStoreState, TempRange, Theme, ViewportData, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/index";
8+
import { AdditionalData, AfterEditEvent, AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeRowRenderEvent, BeforeSaveDataDetails, Cell, CellTemplateProp, ChangedRange, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionCols, DimensionRows, DimensionSettingsState, DimensionType, DimensionTypeCol, DragStartEvent, EditCell, EditorCtr, Editors, ElementScroll, ExtraNodeFuncConfig, FocusAfterRenderEvent, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, MultiDimensionType, Nullable, PluginBaseComponent, PluginProviders, PositionItem, ProvidersColumns, RangeArea, RangeClipboardCopyEventProps, RangeClipboardPasteEvent, RowDefinition, RowDragStartDetails, RowHeaders, SaveDataDetails, SelectionStoreState, TempRange, Theme, ViewportData, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/index";
99
import { GridPlugin } from "./plugins/base.plugin";
1010
import { AutoSizeColumnConfig } from "./plugins/column.auto-size.plugin";
1111
import { ColumnFilterConfig, FilterCaptions, FilterCollectionItem, LogicFunction, MultiFilterItem, ShowData } from "./plugins/filter/filter.types";
@@ -21,7 +21,7 @@ import { ResizeProps } from "./components/header/resizable.directive";
2121
import { HeaderRenderProps } from "./components/header/header-renderer";
2222
import { HeaderGroupRendererProps } from "./components/header/header-group-renderer";
2323
import { EventData } from "./components/overlay/selection.utils";
24-
export { AdditionalData, AfterEditEvent, AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeRowRenderEvent, BeforeSaveDataDetails, Cell, CellTemplateProp, ChangedRange, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionCols, DimensionRows, DimensionSettingsState, DimensionType, DimensionTypeCol, DragStartEvent, EditCell, EditorCtr, Editors, ElementScroll, ExtraNodeFuncConfig, FocusAfterRenderEvent, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, MultiDimensionType, Nullable, PluginBaseComponent, PositionItem, ProvidersColumns, RangeArea, RangeClipboardCopyEventProps, RangeClipboardPasteEvent, RowDefinition, RowDragStartDetails, RowHeaders, SaveDataDetails, SelectionStoreState, TempRange, Theme, ViewportData, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/index";
24+
export { AdditionalData, AfterEditEvent, AllDimensionType, ApplyFocusEvent, BeforeCellRenderEvent, BeforeEdit, BeforeRangeSaveDataDetails, BeforeRowRenderEvent, BeforeSaveDataDetails, Cell, CellTemplateProp, ChangedRange, ColumnDataSchemaModel, ColumnGrouping, ColumnProp, ColumnRegular, ColumnType, DataFormat, DataType, DimensionCols, DimensionRows, DimensionSettingsState, DimensionType, DimensionTypeCol, DragStartEvent, EditCell, EditorCtr, Editors, ElementScroll, ExtraNodeFuncConfig, FocusAfterRenderEvent, FocusRenderEvent, FocusTemplateFunc, InitialHeaderClick, MultiDimensionType, Nullable, PluginBaseComponent, PluginProviders, PositionItem, ProvidersColumns, RangeArea, RangeClipboardCopyEventProps, RangeClipboardPasteEvent, RowDefinition, RowDragStartDetails, RowHeaders, SaveDataDetails, SelectionStoreState, TempRange, Theme, ViewportData, ViewPortResizeEvent, ViewPortScrollEvent, ViewportState, ViewSettingSizeProp } from "./types/index";
2525
export { GridPlugin } from "./plugins/base.plugin";
2626
export { AutoSizeColumnConfig } from "./plugins/column.auto-size.plugin";
2727
export { ColumnFilterConfig, FilterCaptions, FilterCollectionItem, LogicFunction, MultiFilterItem, ShowData } from "./plugins/filter/filter.types";
@@ -153,6 +153,10 @@ export namespace Components {
153153
* Get all active plugins instances
154154
*/
155155
"getPlugins": () => Promise<PluginBaseComponent[]>;
156+
/**
157+
* Get all providers for grid Useful for external grid integration
158+
*/
159+
"getProviders": () => Promise<PluginProviders | undefined>;
156160
/**
157161
* Get the currently selected Range.
158162
*/

src/components/revoGrid/revo-grid.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -918,6 +918,14 @@ export class RevoGridComponent {
918918
this.extraService?.refresh();
919919
}
920920

921+
/**
922+
* Get all providers for grid
923+
* Useful for external grid integration
924+
*/
925+
@Method() async getProviders() {
926+
return this.getPluginData();
927+
}
928+
921929
// #endregion
922930

923931
// #region Listeners outside scope

src/components/revoGrid/viewport.resize.service.ts

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import throttle from 'lodash/throttle';
2-
import { resizeObserver } from '../../utils/resize-observer.polifill';
3-
42
type ResizeEntry = {
53
width: number;
64
height: number;
@@ -11,14 +9,11 @@ export default class GridResizeService {
119
width: 0,
1210
height: 0,
1311
};
14-
private readonly apply = throttle(
15-
(e: ReadonlyArray<ResizeObserverEntry>) => {
16-
if (!e.length) {
17-
return;
18-
}
12+
readonly apply = throttle(
13+
(e: { width: number, height: number }) => {
1914
const entry = {
20-
width: e[0].contentRect.width,
21-
height: e[0].contentRect.height,
15+
width: e.width,
16+
height: e.height,
2217
};
2318
this.resize?.(entry, this.previousSize);
2419
this.previousSize = entry;
@@ -35,17 +30,34 @@ export default class GridResizeService {
3530
entry: ResizeEntry,
3631
previousSize: ResizeEntry,
3732
) => void,
33+
elements: (HTMLElement | undefined)[],
3834
) {
39-
this.init(el);
35+
const extras: HTMLElement[] = [];
36+
elements.forEach((element) => {
37+
if (element) {
38+
extras.push(element);
39+
}
40+
});
41+
this.init(el, extras);
4042
}
4143

42-
async init(el: HTMLElement): Promise<void> {
43-
await resizeObserver();
44-
this.resizeObserver = new ResizeObserver(this.apply);
45-
this.resizeObserver?.observe(el);
44+
init(el: HTMLElement, extras: HTMLElement[] = []) {
45+
const observer = this.resizeObserver = new ResizeObserver((e) => {
46+
if (e.length) {
47+
if (e[0].target === el) {
48+
this.apply(e[0].contentRect);
49+
} else {
50+
this.apply(el.getBoundingClientRect());
51+
}
52+
}
53+
});
54+
observer.observe(el);
55+
extras.forEach((extra) => {
56+
observer.observe(extra);
57+
});
4658
}
4759

48-
public destroy() {
60+
destroy() {
4961
this.resizeObserver?.disconnect();
5062
this.resizeObserver = null;
5163
}

src/components/scroll/revogr-viewport-scroll.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ export class RevogrViewportScroll implements ElementScroll {
262262
this.setScrollVisibility(dimension, item.size, item.contentSize);
263263
}
264264
},
265+
[this.footer, this.header],
265266
);
266267
}
267268

src/utils/resize-observer.polifill.ts

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)