Golden Layout v2 Stack size issues

Discussão em 'Angular' iniciado por danwellman, Abril 7, 2025.

  1. danwellman

    danwellman Guest

    We have migrated from old golden-layout to golden-layout 2 in our Angular 17 app, and things are mostly working as expected, however I have one bizarre issue left that I have not been able to solve.

    In our app we have dashboards, which contain a golden-layout with some widgets inside the layout. Each widget is a standard wrapper with a (golden-layout) ContentItem inside it.

    The configs for each dashboard are stored on back-end, so whenever a dashboard loads, it gets the config from server and initialises golden-layout with this config.

    Part of app functionality is user can customise this dashboard and save it as a custom dashboard for only themselves. Process is like this:

    • User visits standard dashboard
    • User customises dashboard in some way - adding/removing widgets, rearranging them, resizing them, etc and then saves dashboard
    • User is then redirected to new custom dashboard

    The issue is that if user resizes the widgets on a dashboard and then saves the dashboard, when user is redirected to the custom dashboard, the sizes of the widgets is ignored. Other changes like adding/removing/rearranging the widgets are preserved, it is only the sizes of the widgets that is ignored. But then if user does a refresh in the browser and custom page loads again, then it does have the correct heights as set by the user before saving custom dashboard.

    These are some things I checked:

    • Correct heights are sent to the back-end when saving the page after resizing - they are.
    • Correct heights are returned from the back-end when redirecting to the new portal page - they are.
    • New heights are passed into the GoldenLayout loadLayout method after returned by back-end - they are
    • I've tried clearing the layout with goldenLayout.clear() before calling loadLayout - made no difference
    • I've tried completely destroying the layout with goldenLayout.destroy() before calling loadLayout - made no difference
    • I've tried explicitly setting the new heights manually on the components inside the stacks - made no difference
    • I've tried using the new golden-layout-2 size property instead of the old width/height properties - made no difference

    Whether page is loaded from scratch or redirected after saving page we still go through same life-cycle, so config is returned from server, new GoldenLayout() and loadLayout are used both times.

    I saved the configs that are returned when loading page from scratch and after being redirected and checked them in Kdiff - they are mostly identical except for height properties and some minor differences like having null instead of empty string for row/column titles.

    Here is a copy of config returned by back-end when originally loading a dashboard:

    {
    "content": [
    {
    "type": "row",
    "content": [
    {
    "type": "column",
    "content": [
    {
    "type": "stack",
    "content": [
    {
    "type": "component",
    "content": null,
    "width": null,
    "height": null,
    "id": null,
    "isClosable": true,
    "title": "Widget 1",
    "componentName": "widget-golden-instance",
    "componentState": {},
    "widgetLayoutedInstanceId": "1678f085-fd28-403b-b704-3a79eb66ae7a",
    "componentType": "widget-golden-instance"
    }
    ],
    "width": null,
    "height": 27.1869849654493,
    "id": "c895ec22-ec21-483b-a050-be9c4c30f580",
    "isClosable": true,
    "title": "",
    "componentName": null,
    "componentState": null,
    "widgetLayoutedInstanceId": null
    },
    {
    "type": "stack",
    "content": [
    {
    "type": "component",
    "content": null,
    "width": null,
    "height": null,
    "id": null,
    "isClosable": true,
    "title": "Widget 2",
    "componentName": "widget-golden-instance",
    "componentState": {},
    "widgetLayoutedInstanceId": "a2893d62-8d46-44c7-85f8-2962c51a1f2e",
    "componentType": "widget-golden-instance"
    }
    ],
    "width": null,
    "height": 31.9728276435933,
    "id": "68c4c539-c387-42f7-ba05-6d8352e6749c",
    "isClosable": true,
    "title": "",
    "componentName": null,
    "componentState": null,
    "widgetLayoutedInstanceId": null
    },
    {
    "type": "stack",
    "content": [
    {
    "type": "component",
    "content": null,
    "width": null,
    "height": null,
    "id": null,
    "isClosable": true,
    "title": "Widget 3",
    "componentName": "widget-golden-instance",
    "componentState": {},
    "widgetLayoutedInstanceId": "65cd9ba3-6ac1-4b30-8a09-d6c7c66eec44",
    "componentType": "widget-golden-instance"
    }
    ],
    "width": null,
    "height": 40.8401873909574,
    "id": "a296858d-2494-4178-a4d6-09f49dae300f",
    "isClosable": true,
    "title": "",
    "componentName": null,
    "componentState": null,
    "widgetLayoutedInstanceId": null
    }
    ],
    "width": 100,
    "height": null,
    "id": "388d4498-b157-43b1-bf4d-038bd1d5509f",
    "isClosable": true,
    "title": "",
    "componentName": null,
    "componentState": null,
    "widgetLayoutedInstanceId": null
    }
    ],
    "width": 100,
    "height": null,
    "id": "b167d6ca-f57f-4add-bdcf-1cf5323b3558",
    "isClosable": true,
    "title": "",
    "componentName": null,
    "widgetLayoutedInstanceId": null
    }
    ],
    "dimensions": {
    "defaultMinItemHeight": "60px",
    "defaultMinItemWidth": "300px",
    "dragProxyWidth": 300,
    "dragProxyHeight": 300
    },
    "settings": {
    "hasHeaders": true,
    "showPopoutIcon": false
    }
    }


    And here is copy of config returned by back-end after being redirected (when sizes are of items are not correct):

    {
    "content": [
    {
    "type": "row",
    "content": [
    {
    "type": "column",
    "content": [
    {
    "type": "stack",
    "content": [
    {
    "type": "component",
    "content": null,
    "width": null,
    "height": null,
    "id": null,
    "isClosable": true,
    "title": "Widget 1",
    "componentName": "widget-golden-instance",
    "componentState": {},
    "widgetLayoutedInstanceId": "1678f085-fd28-403b-b704-3a79eb66ae7a",
    "componentType": "widget-golden-instance"
    }
    ],
    "width": null,
    "height": 41.79549901048402,
    "id": "c895ec22-ec21-483b-a050-be9c4c30f580",
    "isClosable": true,
    "title": "",
    "componentName": null,
    "componentState": null,
    "widgetLayoutedInstanceId": null
    },
    {
    "type": "stack",
    "content": [
    {
    "type": "component",
    "content": null,
    "width": null,
    "height": null,
    "id": null,
    "isClosable": true,
    "title": "Widget 2",
    "componentName": "widget-golden-instance",
    "componentState": {},
    "widgetLayoutedInstanceId": "a2893d62-8d46-44c7-85f8-2962c51a1f2e",
    "componentType": "widget-golden-instance"
    }
    ],
    "width": null,
    "height": 17.36431359855858,
    "id": "68c4c539-c387-42f7-ba05-6d8352e6749c",
    "isClosable": true,
    "title": "",
    "componentName": null,
    "componentState": null,
    "widgetLayoutedInstanceId": null
    },
    {
    "type": "stack",
    "content": [
    {
    "type": "component",
    "content": null,
    "width": null,
    "height": null,
    "id": null,
    "isClosable": true,
    "title": "Widget 3",
    "componentName": "widget-golden-instance",
    "componentState": {},
    "widgetLayoutedInstanceId": "65cd9ba3-6ac1-4b30-8a09-d6c7c66eec44",
    "componentType": "widget-golden-instance"
    }
    ],
    "width": null,
    "height": 40.8401873909574,
    "id": "a296858d-2494-4178-a4d6-09f49dae300f",
    "isClosable": true,
    "title": "",
    "componentName": null,
    "componentState": null,
    "widgetLayoutedInstanceId": null
    }
    ],
    "width": 100,
    "height": null,
    "id": "388d4498-b157-43b1-bf4d-038bd1d5509f",
    "isClosable": true,
    "title": "",
    "componentName": null,
    "componentState": null,
    "widgetLayoutedInstanceId": null
    }
    ],
    "width": 100,
    "height": null,
    "id": "b167d6ca-f57f-4add-bdcf-1cf5323b3558",
    "isClosable": true,
    "title": "",
    "componentName": null,
    "widgetLayoutedInstanceId": null
    }
    ],
    "dimensions": {
    "defaultMinItemHeight": "60px",
    "defaultMinItemWidth": "300px",
    "dragProxyWidth": 300,
    "dragProxyHeight": 300
    },
    "settings": {
    "hasHeaders": true,
    "showPopoutIcon": false
    }
    }


    I've pretty much run out things to check/fix at this point - hoping someone can suggest something I may have missed

    Continue reading...

Compartilhe esta Página