Issue #5460Opened October 12, 2023by mapsmarketing1 reactions

BUG: Loading `component` and `styles` from `pageManager`

Question

GrapesJS version

  • I confirm to use the latest version of GrapesJS

What browser are you using?

Chrome v117.0.5938.149

Reproducible demo link

https://jsfiddle.net/9oLrsvya/

Describe the bug

How to reproduce the bug?

  1. Please see the pageManager object in the jsfiddle

What is the expected behavior? Looking at the following documentation: https://grapesjs.com/docs/api/pages.html#pages

It should load in the component and styles from the pageManager correctly into the editor.

What is the current behavior? When you check the code via "view code" in the editor you'll notice neither the exact HTML neither the styles have correctly loaded. The body tag does not retain the ID tag that the editor adds when applying any kind of styling to it which means the styling won't work. And the CSS hasn't loaded in correctly at all.


If it is a confirmed bug, I'd be happy to attempt to fix it. It would be great to roughly know where the component and styles are being loaded from as I am not intimately familiar with the project files.

Code of Conduct

  • I agree to follow this project's Code of Conduct

Answers (3)

mapsmarketingOctober 13, 20231 reactions

One annoying thing is that the editor is prepending the below default styles which when saving the styles has numerous duplicates of it:

* {
  box-sizing: border-box;
}
body {
  margin: 0;
}

Edit: Looking at the docs I finally managed to find protectedCss and when set to empty stops the styles being prepended.

artfOctober 12, 20230 reactions

Hi @mapsmarketing currently GrapesJS is not able to properly import HTML documents as string, so the parser skips elements like html, head, body and returns only what is parsed inside the body, one workaround you could do right now is to pass component as object

component: {
  attributes: { id: 'ignt' },
  components: '<div class="my-el">Testing world!</div>',
},

Regarding the styles, it's the browser's default CSSOM parser issue, please refer to this plugin

mapsmarketingOctober 13, 20230 reactions

Hi @artf ,

I've found a way to get the body attributes along with the styles saving correctly via the following method:

const pageManager = editor.Pages;
const page = pageManager.get('my-page-id').toJSON();
const component = pageManager.get('my-page-id').getMainComponent();
page.styles = editor.getCss({ component });

I noticed that your Page.toJSON outputs everything of the specified page. However, it doesn't seem to output the styles correctly (it's always set as undefined for me), so I retrieve the styles for the active page via the editor and override the ones in the JSON. I believe styles are not set due to the if (!props.frames) check you have in Page.ts

The below is an example of how I'm loading in the HTML. I am using frames since component doesn't work with the supplied structure. I am loading in the styles without the use of the parser plugin and it seems to be loading in without issues.

const pageJSON = {...}; // Contains the `frames` and `styles`
const editor = grapesjs.init({
    pageManager: {
        pages: [
            {
                id: 'my-page-id',
                frames: pageJSON.frames,
                styles: pageJSON.styles,
            }
        ]
    }
});

I also noticed that the PageManager.select function doesn't update styles when switching between the pages which forces me to run: editor.setStyle(pageJSON.styles);

Related Questions and Answers

Continue research with similar issue discussions.

Paid Plugins That Match This Issue

Curated by issue keywords and label relevance to help you ship faster.

View all plugins

Loading paid plugin recommendations...

Browse Plugin Categories

Jump directly to plugin category pages on the marketplace.