@revolist/revogrid 4.0.36 → 4.0.39

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.
@@ -528,6 +528,7 @@ export declare class RevoGridComponent {
528
528
  viewportProvider: ViewportProvider;
529
529
  private themeService;
530
530
  private viewport;
531
+ private isInited;
531
532
  private orderService;
532
533
  private selectionStoreConnector;
533
534
  private scrollingService;
@@ -559,8 +560,17 @@ export declare class RevoGridComponent {
559
560
  * Register external VNodes
560
561
  */
561
562
  registerOutsideVNodes(elements?: VNode[]): void;
562
- componentWillRender(): false | Promise<any[]>;
563
+ private setPlugins;
564
+ private removePlugins;
563
565
  connectedCallback(): void;
564
- disconnectedCallback(): void;
566
+ /**
567
+ * Called once just after the component is first connected to the DOM.
568
+ * Since this method is only called once, it's a good place to load data asynchronously and to setup the state
569
+ * without triggering extra re-renders.
570
+ * A promise can be returned, that can be used to wait for the first render().
571
+ */
572
+ componentWillLoad(): void;
573
+ componentWillRender(): false | Promise<any[]>;
565
574
  render(): any;
575
+ disconnectedCallback(): void;
566
576
  }
package/hydrate/index.js CHANGED
@@ -14092,6 +14092,7 @@ class RevoGridComponent {
14092
14092
  // UUID required to support multiple grids in one page and avoid collision
14093
14093
  this.uuid = null;
14094
14094
  this.viewport = null;
14095
+ this.isInited = false;
14095
14096
  /**
14096
14097
  * Plugins
14097
14098
  * Define plugins collection
@@ -14602,30 +14603,11 @@ class RevoGridComponent {
14602
14603
  this.extraElements = [...this.extraElements, ...elements];
14603
14604
  }
14604
14605
  // #endregion
14605
- componentWillRender() {
14606
- const event = this.beforegridrender.emit();
14607
- if (event.defaultPrevented) {
14608
- return false;
14609
- }
14610
- return Promise.all(this.jobsBeforeRender);
14611
- }
14612
- connectedCallback() {
14613
- // #region Setup Providers
14614
- this.viewportProvider = new ViewportProvider();
14615
- this.themeService = new ThemeService({
14616
- rowSize: this.rowSize,
14617
- });
14618
- this.dimensionProvider = new DimensionProvider(this.viewportProvider, {
14619
- realSizeChanged: (k) => this.contentsizechanged.emit(k),
14620
- });
14621
- this.columnProvider = new ColumnDataProvider();
14622
- this.selectionStoreConnector = new SelectionStoreConnector();
14623
- this.dataProvider = new DataProvider(this.dimensionProvider);
14624
- // #endregion
14625
- // generate uuid for this grid
14626
- this.uuid = `${new Date().getTime()}-rvgrid`;
14627
- this.registerOutsideVNodes(this.registerVNode);
14628
- // #region Plugins
14606
+ // #region Plugins
14607
+ setPlugins() {
14608
+ var _a;
14609
+ // remove old plugins if any
14610
+ this.removePlugins();
14629
14611
  // pass data provider to plugins
14630
14612
  const pluginData = {
14631
14613
  data: this.dataProvider,
@@ -14656,12 +14638,43 @@ class RevoGridComponent {
14656
14638
  this.internalPlugins.push(new ColumnPlugin(this.element, pluginData));
14657
14639
  }
14658
14640
  // register user plugins
14659
- if (this.plugins) {
14660
- this.plugins.forEach(p => {
14661
- this.internalPlugins.push(new p(this.element, pluginData));
14662
- });
14641
+ (_a = this.plugins) === null || _a === void 0 ? void 0 : _a.forEach(p => this.internalPlugins.push(new p(this.element, pluginData)));
14642
+ }
14643
+ removePlugins() {
14644
+ this.internalPlugins.forEach(p => p.destroy());
14645
+ this.internalPlugins = [];
14646
+ }
14647
+ // #endregion
14648
+ // if reconnect to dom we need to set up plugins
14649
+ connectedCallback() {
14650
+ if (this.isInited) {
14651
+ this.setPlugins();
14663
14652
  }
14653
+ }
14654
+ /**
14655
+ * Called once just after the component is first connected to the DOM.
14656
+ * Since this method is only called once, it's a good place to load data asynchronously and to setup the state
14657
+ * without triggering extra re-renders.
14658
+ * A promise can be returned, that can be used to wait for the first render().
14659
+ */
14660
+ componentWillLoad() {
14661
+ // #region Setup Providers
14662
+ this.viewportProvider = new ViewportProvider();
14663
+ this.themeService = new ThemeService({
14664
+ rowSize: this.rowSize,
14665
+ });
14666
+ this.dimensionProvider = new DimensionProvider(this.viewportProvider, {
14667
+ realSizeChanged: (k) => this.contentsizechanged.emit(k),
14668
+ });
14669
+ this.columnProvider = new ColumnDataProvider();
14670
+ this.selectionStoreConnector = new SelectionStoreConnector();
14671
+ this.dataProvider = new DataProvider(this.dimensionProvider);
14664
14672
  // #endregion
14673
+ // generate uuid for this grid
14674
+ this.uuid = `rv--${Math.random().toString(36).slice(2, 6)}-${Date.now()}`;
14675
+ this.registerOutsideVNodes(this.registerVNode);
14676
+ // init plugins
14677
+ this.setPlugins();
14665
14678
  // set data
14666
14679
  this.applyStretch(this.stretch);
14667
14680
  this.themeChanged(this.theme, undefined, undefined, true);
@@ -14681,11 +14694,15 @@ class RevoGridComponent {
14681
14694
  this.viewportscroll.emit(e);
14682
14695
  });
14683
14696
  this.aftergridinit.emit();
14697
+ // set inited flag for connectedCallback
14698
+ this.isInited = true;
14684
14699
  }
14685
- disconnectedCallback() {
14686
- // destroy plugins on element disconnect
14687
- this.internalPlugins.forEach(p => p.destroy());
14688
- this.internalPlugins = [];
14700
+ componentWillRender() {
14701
+ const event = this.beforegridrender.emit();
14702
+ if (event.defaultPrevented) {
14703
+ return false;
14704
+ }
14705
+ return Promise.all(this.jobsBeforeRender);
14689
14706
  }
14690
14707
  render() {
14691
14708
  const contentHeight = this.dimensionProvider.stores['rgRow'].store.get('realSize');
@@ -14723,7 +14740,7 @@ class RevoGridComponent {
14723
14740
  const headerProperties = Object.assign(Object.assign({}, view.headerProp), { type: view.type, additionalData: this.additionalData, viewportCol: view.viewportCol, selectionStore: view.columnSelectionStore, canResize: this.resize, readonly: this.readonly, columnFilter: !!this.filter });
14724
14741
  // Column headers
14725
14742
  const dataViews = [
14726
- hAsync("revogr-header", Object.assign({ key: 'b3c3ccd088d6a01511b07f66f7dc937617a4786d' }, headerProperties, { slot: HEADER_SLOT })),
14743
+ hAsync("revogr-header", Object.assign({ key: '67b0af56acae99e5b999c0b338a279b076022171' }, headerProperties, { slot: HEADER_SLOT })),
14727
14744
  ];
14728
14745
  // Render viewport data (vertical sections)
14729
14746
  view.dataPorts.forEach(data => {
@@ -14745,11 +14762,15 @@ class RevoGridComponent {
14745
14762
  const typeCol = 'rgCol';
14746
14763
  const viewports = this.viewportProvider.stores;
14747
14764
  const dimensions = this.dimensionProvider.stores;
14748
- return (hAsync(Host, { key: '6c36df93ae796fbfeee95cb5ab789a1f9b0c42f1', [`${UUID}`]: this.uuid }, this.hideAttribution ? null : (hAsync("revogr-attribution", { class: "attribution" })), hAsync("div", { key: 'e5cd68158497d79d98ce4f92f1e816b60acbf6ac', class: "main-viewport", onClick: (e) => {
14765
+ return (hAsync(Host, { key: '3837943944ca3c255083a2fa7fa125291442b98a', [`${UUID}`]: this.uuid }, this.hideAttribution ? null : (hAsync("revogr-attribution", { class: "attribution" })), hAsync("div", { key: '97e0e9cbd158c398945e0d5c0c43a93422c090f9', class: "main-viewport", onClick: (e) => {
14749
14766
  if (e.currentTarget === e.target) {
14750
14767
  this.viewport.clearEdit();
14751
14768
  }
14752
- } }, hAsync("div", { key: '9f121f8e4184f38ad0f086eeabb287434dbae101', class: "viewports" }, hAsync("slot", { key: 'e234abc3d5a6b1ddbe1fb1da4e415e754444057d', name: "viewport" }), viewportSections, hAsync("revogr-scroll-virtual", { key: 'c7b915c6117a822cea1fadce5111cd665f5a43d9', class: "vertical", dimension: typeRow, viewportStore: viewports[typeRow].store, dimensionStore: dimensions[typeRow].store, ref: el => this.scrollingService.registerElement(el, 'rowScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), hAsync(OrderRenderer, { key: '5e6c259216474164247f2120eb9a16786ce03e6f', ref: e => (this.orderService = e) }))), hAsync("revogr-scroll-virtual", { key: 'ce8e46b6e7913e798b8d1bd094a4c61a54b73a0a', class: "horizontal", dimension: typeCol, viewportStore: viewports[typeCol].store, dimensionStore: dimensions[typeCol].store, ref: el => this.scrollingService.registerElement(el, 'colScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), this.extraElements));
14769
+ } }, hAsync("div", { key: '9c77a61499d749aa2e786f593715d8bcacdb3ad0', class: "viewports" }, hAsync("slot", { key: '8af1657ec8ec9b7f56afe957f589d64b55c53bcd', name: "viewport" }), viewportSections, hAsync("revogr-scroll-virtual", { key: '1947f0706d5e9e552822a44a55504ae82c603ce7', class: "vertical", dimension: typeRow, viewportStore: viewports[typeRow].store, dimensionStore: dimensions[typeRow].store, ref: el => this.scrollingService.registerElement(el, 'rowScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), hAsync(OrderRenderer, { key: '6cf863db4b189cf9480d5aca1473832f0ee322b5', ref: e => (this.orderService = e) }))), hAsync("revogr-scroll-virtual", { key: '542cc17558cc0cfa1def201870e0cac8f83ebd36', class: "horizontal", dimension: typeCol, viewportStore: viewports[typeCol].store, dimensionStore: dimensions[typeCol].store, ref: el => this.scrollingService.registerElement(el, 'colScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), this.extraElements));
14770
+ }
14771
+ disconnectedCallback() {
14772
+ // Remove all plugins, to avoid memory leaks and unexpected behaviour when the component is removed
14773
+ this.removePlugins();
14753
14774
  }
14754
14775
  get element() { return getElement(this); }
14755
14776
  static get watchers() { return {
package/hydrate/index.mjs CHANGED
@@ -14088,6 +14088,7 @@ class RevoGridComponent {
14088
14088
  // UUID required to support multiple grids in one page and avoid collision
14089
14089
  this.uuid = null;
14090
14090
  this.viewport = null;
14091
+ this.isInited = false;
14091
14092
  /**
14092
14093
  * Plugins
14093
14094
  * Define plugins collection
@@ -14598,30 +14599,11 @@ class RevoGridComponent {
14598
14599
  this.extraElements = [...this.extraElements, ...elements];
14599
14600
  }
14600
14601
  // #endregion
14601
- componentWillRender() {
14602
- const event = this.beforegridrender.emit();
14603
- if (event.defaultPrevented) {
14604
- return false;
14605
- }
14606
- return Promise.all(this.jobsBeforeRender);
14607
- }
14608
- connectedCallback() {
14609
- // #region Setup Providers
14610
- this.viewportProvider = new ViewportProvider();
14611
- this.themeService = new ThemeService({
14612
- rowSize: this.rowSize,
14613
- });
14614
- this.dimensionProvider = new DimensionProvider(this.viewportProvider, {
14615
- realSizeChanged: (k) => this.contentsizechanged.emit(k),
14616
- });
14617
- this.columnProvider = new ColumnDataProvider();
14618
- this.selectionStoreConnector = new SelectionStoreConnector();
14619
- this.dataProvider = new DataProvider(this.dimensionProvider);
14620
- // #endregion
14621
- // generate uuid for this grid
14622
- this.uuid = `${new Date().getTime()}-rvgrid`;
14623
- this.registerOutsideVNodes(this.registerVNode);
14624
- // #region Plugins
14602
+ // #region Plugins
14603
+ setPlugins() {
14604
+ var _a;
14605
+ // remove old plugins if any
14606
+ this.removePlugins();
14625
14607
  // pass data provider to plugins
14626
14608
  const pluginData = {
14627
14609
  data: this.dataProvider,
@@ -14652,12 +14634,43 @@ class RevoGridComponent {
14652
14634
  this.internalPlugins.push(new ColumnPlugin(this.element, pluginData));
14653
14635
  }
14654
14636
  // register user plugins
14655
- if (this.plugins) {
14656
- this.plugins.forEach(p => {
14657
- this.internalPlugins.push(new p(this.element, pluginData));
14658
- });
14637
+ (_a = this.plugins) === null || _a === void 0 ? void 0 : _a.forEach(p => this.internalPlugins.push(new p(this.element, pluginData)));
14638
+ }
14639
+ removePlugins() {
14640
+ this.internalPlugins.forEach(p => p.destroy());
14641
+ this.internalPlugins = [];
14642
+ }
14643
+ // #endregion
14644
+ // if reconnect to dom we need to set up plugins
14645
+ connectedCallback() {
14646
+ if (this.isInited) {
14647
+ this.setPlugins();
14659
14648
  }
14649
+ }
14650
+ /**
14651
+ * Called once just after the component is first connected to the DOM.
14652
+ * Since this method is only called once, it's a good place to load data asynchronously and to setup the state
14653
+ * without triggering extra re-renders.
14654
+ * A promise can be returned, that can be used to wait for the first render().
14655
+ */
14656
+ componentWillLoad() {
14657
+ // #region Setup Providers
14658
+ this.viewportProvider = new ViewportProvider();
14659
+ this.themeService = new ThemeService({
14660
+ rowSize: this.rowSize,
14661
+ });
14662
+ this.dimensionProvider = new DimensionProvider(this.viewportProvider, {
14663
+ realSizeChanged: (k) => this.contentsizechanged.emit(k),
14664
+ });
14665
+ this.columnProvider = new ColumnDataProvider();
14666
+ this.selectionStoreConnector = new SelectionStoreConnector();
14667
+ this.dataProvider = new DataProvider(this.dimensionProvider);
14660
14668
  // #endregion
14669
+ // generate uuid for this grid
14670
+ this.uuid = `rv--${Math.random().toString(36).slice(2, 6)}-${Date.now()}`;
14671
+ this.registerOutsideVNodes(this.registerVNode);
14672
+ // init plugins
14673
+ this.setPlugins();
14661
14674
  // set data
14662
14675
  this.applyStretch(this.stretch);
14663
14676
  this.themeChanged(this.theme, undefined, undefined, true);
@@ -14677,11 +14690,15 @@ class RevoGridComponent {
14677
14690
  this.viewportscroll.emit(e);
14678
14691
  });
14679
14692
  this.aftergridinit.emit();
14693
+ // set inited flag for connectedCallback
14694
+ this.isInited = true;
14680
14695
  }
14681
- disconnectedCallback() {
14682
- // destroy plugins on element disconnect
14683
- this.internalPlugins.forEach(p => p.destroy());
14684
- this.internalPlugins = [];
14696
+ componentWillRender() {
14697
+ const event = this.beforegridrender.emit();
14698
+ if (event.defaultPrevented) {
14699
+ return false;
14700
+ }
14701
+ return Promise.all(this.jobsBeforeRender);
14685
14702
  }
14686
14703
  render() {
14687
14704
  const contentHeight = this.dimensionProvider.stores['rgRow'].store.get('realSize');
@@ -14719,7 +14736,7 @@ class RevoGridComponent {
14719
14736
  const headerProperties = Object.assign(Object.assign({}, view.headerProp), { type: view.type, additionalData: this.additionalData, viewportCol: view.viewportCol, selectionStore: view.columnSelectionStore, canResize: this.resize, readonly: this.readonly, columnFilter: !!this.filter });
14720
14737
  // Column headers
14721
14738
  const dataViews = [
14722
- hAsync("revogr-header", Object.assign({ key: 'b3c3ccd088d6a01511b07f66f7dc937617a4786d' }, headerProperties, { slot: HEADER_SLOT })),
14739
+ hAsync("revogr-header", Object.assign({ key: '67b0af56acae99e5b999c0b338a279b076022171' }, headerProperties, { slot: HEADER_SLOT })),
14723
14740
  ];
14724
14741
  // Render viewport data (vertical sections)
14725
14742
  view.dataPorts.forEach(data => {
@@ -14741,11 +14758,15 @@ class RevoGridComponent {
14741
14758
  const typeCol = 'rgCol';
14742
14759
  const viewports = this.viewportProvider.stores;
14743
14760
  const dimensions = this.dimensionProvider.stores;
14744
- return (hAsync(Host, { key: '6c36df93ae796fbfeee95cb5ab789a1f9b0c42f1', [`${UUID}`]: this.uuid }, this.hideAttribution ? null : (hAsync("revogr-attribution", { class: "attribution" })), hAsync("div", { key: 'e5cd68158497d79d98ce4f92f1e816b60acbf6ac', class: "main-viewport", onClick: (e) => {
14761
+ return (hAsync(Host, { key: '3837943944ca3c255083a2fa7fa125291442b98a', [`${UUID}`]: this.uuid }, this.hideAttribution ? null : (hAsync("revogr-attribution", { class: "attribution" })), hAsync("div", { key: '97e0e9cbd158c398945e0d5c0c43a93422c090f9', class: "main-viewport", onClick: (e) => {
14745
14762
  if (e.currentTarget === e.target) {
14746
14763
  this.viewport.clearEdit();
14747
14764
  }
14748
- } }, hAsync("div", { key: '9f121f8e4184f38ad0f086eeabb287434dbae101', class: "viewports" }, hAsync("slot", { key: 'e234abc3d5a6b1ddbe1fb1da4e415e754444057d', name: "viewport" }), viewportSections, hAsync("revogr-scroll-virtual", { key: 'c7b915c6117a822cea1fadce5111cd665f5a43d9', class: "vertical", dimension: typeRow, viewportStore: viewports[typeRow].store, dimensionStore: dimensions[typeRow].store, ref: el => this.scrollingService.registerElement(el, 'rowScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), hAsync(OrderRenderer, { key: '5e6c259216474164247f2120eb9a16786ce03e6f', ref: e => (this.orderService = e) }))), hAsync("revogr-scroll-virtual", { key: 'ce8e46b6e7913e798b8d1bd094a4c61a54b73a0a', class: "horizontal", dimension: typeCol, viewportStore: viewports[typeCol].store, dimensionStore: dimensions[typeCol].store, ref: el => this.scrollingService.registerElement(el, 'colScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), this.extraElements));
14765
+ } }, hAsync("div", { key: '9c77a61499d749aa2e786f593715d8bcacdb3ad0', class: "viewports" }, hAsync("slot", { key: '8af1657ec8ec9b7f56afe957f589d64b55c53bcd', name: "viewport" }), viewportSections, hAsync("revogr-scroll-virtual", { key: '1947f0706d5e9e552822a44a55504ae82c603ce7', class: "vertical", dimension: typeRow, viewportStore: viewports[typeRow].store, dimensionStore: dimensions[typeRow].store, ref: el => this.scrollingService.registerElement(el, 'rowScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), hAsync(OrderRenderer, { key: '6cf863db4b189cf9480d5aca1473832f0ee322b5', ref: e => (this.orderService = e) }))), hAsync("revogr-scroll-virtual", { key: '542cc17558cc0cfa1def201870e0cac8f83ebd36', class: "horizontal", dimension: typeCol, viewportStore: viewports[typeCol].store, dimensionStore: dimensions[typeCol].store, ref: el => this.scrollingService.registerElement(el, 'colScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), this.extraElements));
14766
+ }
14767
+ disconnectedCallback() {
14768
+ // Remove all plugins, to avoid memory leaks and unexpected behaviour when the component is removed
14769
+ this.removePlugins();
14749
14770
  }
14750
14771
  get element() { return getElement(this); }
14751
14772
  static get watchers() { return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@revolist/revogrid",
3
- "version": "4.0.36",
3
+ "version": "4.0.39",
4
4
  "type": "module",
5
5
  "description": "Virtual reactive data grid spreadsheet component - RevoGrid.",
6
6
  "license": "MIT",
@@ -70,6 +70,10 @@
70
70
  "import": "./standalone/revo-grid.js",
71
71
  "types": "./standalone/revo-grid.d.ts"
72
72
  },
73
+ "./standalone/revo-grid.js": {
74
+ "import": "./standalone/revo-grid.js",
75
+ "types": "./standalone/revo-grid.d.ts"
76
+ },
73
77
  "./loader": {
74
78
  "import": "./loader/index.js",
75
79
  "require": "./loader/index.cjs",
@@ -3429,6 +3429,7 @@ const RevoGridComponent = /*@__PURE__*/ proxyCustomElement(class RevoGridCompone
3429
3429
  // UUID required to support multiple grids in one page and avoid collision
3430
3430
  this.uuid = null;
3431
3431
  this.viewport = null;
3432
+ this.isInited = false;
3432
3433
  /**
3433
3434
  * Plugins
3434
3435
  * Define plugins collection
@@ -3939,30 +3940,11 @@ const RevoGridComponent = /*@__PURE__*/ proxyCustomElement(class RevoGridCompone
3939
3940
  this.extraElements = [...this.extraElements, ...elements];
3940
3941
  }
3941
3942
  // #endregion
3942
- componentWillRender() {
3943
- const event = this.beforegridrender.emit();
3944
- if (event.defaultPrevented) {
3945
- return false;
3946
- }
3947
- return Promise.all(this.jobsBeforeRender);
3948
- }
3949
- connectedCallback() {
3950
- // #region Setup Providers
3951
- this.viewportProvider = new ViewportProvider();
3952
- this.themeService = new ThemeService({
3953
- rowSize: this.rowSize,
3954
- });
3955
- this.dimensionProvider = new DimensionProvider(this.viewportProvider, {
3956
- realSizeChanged: (k) => this.contentsizechanged.emit(k),
3957
- });
3958
- this.columnProvider = new ColumnDataProvider();
3959
- this.selectionStoreConnector = new SelectionStoreConnector();
3960
- this.dataProvider = new DataProvider(this.dimensionProvider);
3961
- // #endregion
3962
- // generate uuid for this grid
3963
- this.uuid = `${new Date().getTime()}-rvgrid`;
3964
- this.registerOutsideVNodes(this.registerVNode);
3965
- // #region Plugins
3943
+ // #region Plugins
3944
+ setPlugins() {
3945
+ var _a;
3946
+ // remove old plugins if any
3947
+ this.removePlugins();
3966
3948
  // pass data provider to plugins
3967
3949
  const pluginData = {
3968
3950
  data: this.dataProvider,
@@ -3993,12 +3975,43 @@ const RevoGridComponent = /*@__PURE__*/ proxyCustomElement(class RevoGridCompone
3993
3975
  this.internalPlugins.push(new ColumnPlugin(this.element, pluginData));
3994
3976
  }
3995
3977
  // register user plugins
3996
- if (this.plugins) {
3997
- this.plugins.forEach(p => {
3998
- this.internalPlugins.push(new p(this.element, pluginData));
3999
- });
3978
+ (_a = this.plugins) === null || _a === void 0 ? void 0 : _a.forEach(p => this.internalPlugins.push(new p(this.element, pluginData)));
3979
+ }
3980
+ removePlugins() {
3981
+ this.internalPlugins.forEach(p => p.destroy());
3982
+ this.internalPlugins = [];
3983
+ }
3984
+ // #endregion
3985
+ // if reconnect to dom we need to set up plugins
3986
+ connectedCallback() {
3987
+ if (this.isInited) {
3988
+ this.setPlugins();
4000
3989
  }
3990
+ }
3991
+ /**
3992
+ * Called once just after the component is first connected to the DOM.
3993
+ * Since this method is only called once, it's a good place to load data asynchronously and to setup the state
3994
+ * without triggering extra re-renders.
3995
+ * A promise can be returned, that can be used to wait for the first render().
3996
+ */
3997
+ componentWillLoad() {
3998
+ // #region Setup Providers
3999
+ this.viewportProvider = new ViewportProvider();
4000
+ this.themeService = new ThemeService({
4001
+ rowSize: this.rowSize,
4002
+ });
4003
+ this.dimensionProvider = new DimensionProvider(this.viewportProvider, {
4004
+ realSizeChanged: (k) => this.contentsizechanged.emit(k),
4005
+ });
4006
+ this.columnProvider = new ColumnDataProvider();
4007
+ this.selectionStoreConnector = new SelectionStoreConnector();
4008
+ this.dataProvider = new DataProvider(this.dimensionProvider);
4001
4009
  // #endregion
4010
+ // generate uuid for this grid
4011
+ this.uuid = `rv--${Math.random().toString(36).slice(2, 6)}-${Date.now()}`;
4012
+ this.registerOutsideVNodes(this.registerVNode);
4013
+ // init plugins
4014
+ this.setPlugins();
4002
4015
  // set data
4003
4016
  this.applyStretch(this.stretch);
4004
4017
  this.themeChanged(this.theme, undefined, undefined, true);
@@ -4018,11 +4031,15 @@ const RevoGridComponent = /*@__PURE__*/ proxyCustomElement(class RevoGridCompone
4018
4031
  this.viewportscroll.emit(e);
4019
4032
  });
4020
4033
  this.aftergridinit.emit();
4034
+ // set inited flag for connectedCallback
4035
+ this.isInited = true;
4021
4036
  }
4022
- disconnectedCallback() {
4023
- // destroy plugins on element disconnect
4024
- this.internalPlugins.forEach(p => p.destroy());
4025
- this.internalPlugins = [];
4037
+ componentWillRender() {
4038
+ const event = this.beforegridrender.emit();
4039
+ if (event.defaultPrevented) {
4040
+ return false;
4041
+ }
4042
+ return Promise.all(this.jobsBeforeRender);
4026
4043
  }
4027
4044
  render() {
4028
4045
  const contentHeight = this.dimensionProvider.stores['rgRow'].store.get('realSize');
@@ -4060,7 +4077,7 @@ const RevoGridComponent = /*@__PURE__*/ proxyCustomElement(class RevoGridCompone
4060
4077
  const headerProperties = Object.assign(Object.assign({}, view.headerProp), { type: view.type, additionalData: this.additionalData, viewportCol: view.viewportCol, selectionStore: view.columnSelectionStore, canResize: this.resize, readonly: this.readonly, columnFilter: !!this.filter });
4061
4078
  // Column headers
4062
4079
  const dataViews = [
4063
- h("revogr-header", Object.assign({ key: 'b3c3ccd088d6a01511b07f66f7dc937617a4786d' }, headerProperties, { slot: HEADER_SLOT })),
4080
+ h("revogr-header", Object.assign({ key: '67b0af56acae99e5b999c0b338a279b076022171' }, headerProperties, { slot: HEADER_SLOT })),
4064
4081
  ];
4065
4082
  // Render viewport data (vertical sections)
4066
4083
  view.dataPorts.forEach(data => {
@@ -4082,11 +4099,15 @@ const RevoGridComponent = /*@__PURE__*/ proxyCustomElement(class RevoGridCompone
4082
4099
  const typeCol = 'rgCol';
4083
4100
  const viewports = this.viewportProvider.stores;
4084
4101
  const dimensions = this.dimensionProvider.stores;
4085
- return (h(Host, { key: '6c36df93ae796fbfeee95cb5ab789a1f9b0c42f1', [`${UUID}`]: this.uuid }, this.hideAttribution ? null : (h("revogr-attribution", { class: "attribution" })), h("div", { key: 'e5cd68158497d79d98ce4f92f1e816b60acbf6ac', class: "main-viewport", onClick: (e) => {
4102
+ return (h(Host, { key: '3837943944ca3c255083a2fa7fa125291442b98a', [`${UUID}`]: this.uuid }, this.hideAttribution ? null : (h("revogr-attribution", { class: "attribution" })), h("div", { key: '97e0e9cbd158c398945e0d5c0c43a93422c090f9', class: "main-viewport", onClick: (e) => {
4086
4103
  if (e.currentTarget === e.target) {
4087
4104
  this.viewport.clearEdit();
4088
4105
  }
4089
- } }, h("div", { key: '9f121f8e4184f38ad0f086eeabb287434dbae101', class: "viewports" }, h("slot", { key: 'e234abc3d5a6b1ddbe1fb1da4e415e754444057d', name: "viewport" }), viewportSections, h("revogr-scroll-virtual", { key: 'c7b915c6117a822cea1fadce5111cd665f5a43d9', class: "vertical", dimension: typeRow, viewportStore: viewports[typeRow].store, dimensionStore: dimensions[typeRow].store, ref: el => this.scrollingService.registerElement(el, 'rowScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), h(OrderRenderer, { key: '5e6c259216474164247f2120eb9a16786ce03e6f', ref: e => (this.orderService = e) }))), h("revogr-scroll-virtual", { key: 'ce8e46b6e7913e798b8d1bd094a4c61a54b73a0a', class: "horizontal", dimension: typeCol, viewportStore: viewports[typeCol].store, dimensionStore: dimensions[typeCol].store, ref: el => this.scrollingService.registerElement(el, 'colScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), this.extraElements));
4106
+ } }, h("div", { key: '9c77a61499d749aa2e786f593715d8bcacdb3ad0', class: "viewports" }, h("slot", { key: '8af1657ec8ec9b7f56afe957f589d64b55c53bcd', name: "viewport" }), viewportSections, h("revogr-scroll-virtual", { key: '1947f0706d5e9e552822a44a55504ae82c603ce7', class: "vertical", dimension: typeRow, viewportStore: viewports[typeRow].store, dimensionStore: dimensions[typeRow].store, ref: el => this.scrollingService.registerElement(el, 'rowScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), h(OrderRenderer, { key: '6cf863db4b189cf9480d5aca1473832f0ee322b5', ref: e => (this.orderService = e) }))), h("revogr-scroll-virtual", { key: '542cc17558cc0cfa1def201870e0cac8f83ebd36', class: "horizontal", dimension: typeCol, viewportStore: viewports[typeCol].store, dimensionStore: dimensions[typeCol].store, ref: el => this.scrollingService.registerElement(el, 'colScroll'), onScrollvirtual: e => this.scrollingService.proxyScroll(e.detail) }), this.extraElements));
4107
+ }
4108
+ disconnectedCallback() {
4109
+ // Remove all plugins, to avoid memory leaks and unexpected behaviour when the component is removed
4110
+ this.removePlugins();
4090
4111
  }
4091
4112
  get element() { return this; }
4092
4113
  static get watchers() { return {