-
-
Notifications
You must be signed in to change notification settings - Fork 351
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add override
and default
options for cumulative configs
#1692
Comments
I would like to be able to flexibly configure this inheritance. For the first two, you need to use a common complex Layout, for the latter, a simpler layout. Accordingly, I would like to be able to set my own Layout for /create, overwriting the original one. However, there are also reverse situations when you need to specify the Layout for 1 of the many pages, for example: In this case, I have added additional navigation for pages /companies - the ability to inherit previous Layouts is great |
@bighorik Yeah, currently the only way is to do this:
Let me know whether it's a showstopper for you and I'll bump the priority of this ticket. |
I'd love a way to "escape" from a parent layout defined in the renderer. In my app, I have
I have a workaround in renderer's layout, but I don't like it:
Moving the |
@AgentEnder Makes sense. I think this would be nice: // pages/some-page/+config.js
export default {
// Remove all inherited layouts
Layout: null
} |
That could work, currently I divide my PageShell component into MinimumPageShell and the base PageShell as saw above. Ideally I'd be able to set a Layout that is just the MinimumPageShell |
override
and default
override
and default
options for cumulative configs
Unfortunately, this is not suitable. I have a layout common to all pages, which at some levels of nesting of the file system must be completely overwritten. I'm using vike version 0.4.171 in production, and the lack of backward compatibility makes me cry :( |
Can you elaborate?
The |
That seems a bit excessive if there's only one page that requires a specific layout, while all the other pages use the default layout. |
Labeling this as |
I have a layout with a sidebar and a right-hand panel that generally is centered with a maximum width, but occasionally needs to be broken out to take up the full right hand width. Currently, I would need to redefine the typical case on every page, and only occasionally leave out the layout so the child can take up the full width. I bet there are other cases like this, but I wonder how the default and overrides should really work. There's definitely parts of the layout I want on every page, parts that I want on most pages, and parts that I want on some pages. There's a hierarchy there and I'm not sure whether it's defaults or overrides or some other way to configure the layout. There are also cases where I want to swap out portions of the sidebar depending on the context, and not have that be dynamic, but just a part of those page's layout. EDIT: This no longer matters to me. I set up a custom config flag that affects the layout. This works well for me. |
Indeed, using custom settings can be a workaround. Although note that all Layout code is loaded regardless of whether it's used then. |
Bumping to
Comment welcome. I could, maybe, implement this within a day. |
(Edit: After digging through the source code and having a cold shower, I think there's a better & generic solution, see next comment) Just hit upon this myself, and was quite suprised that there isn't an out-of-the box solution for it. After thinking about this a bit, here's my two cents on it - the problem is a bit more complicated than it appears on first thought.
Some observations about the problem space:
A few sidenotes:
Based on these considerations, I would propose something like this: // +config.ts
// Alternative 1:
export default {
Layout: {
parent: "/some/other/folder" | "../" | null,
use: LayoutForThisPageAndChildren
}
}
// Alternative 2:
export default {
Layout: {
extends: "/some/other/folder" | "../" | null,
use: LayoutForThisPageAndChildren
}
}
// Alternative 3:
export default {
extendsLayout: "/some/other/folder" | "../" | null,
Layout: LayoutForThisPageAndChildren
} Based on alternative 2, here's a more complete example: // src/pages/+config.ts
export default {
Layout: DefaultLayout
}
// src/pages/login/+config.ts
export default {
Layout: {
extends: null, // Use (blank root) as parent
use: LoginLayout
}
}
// src/pages/article/seller-statistics/+Layout.ts
export default {
extends: "/admin",
use: function ({ children }) {
...
},
}
// src/pages/cart/checkout/+Layout.ts
export default {
extends: "/(minimal-layout)",
use: CheckoutLayout
}
// src/pages/(minimal-layout)/+Layout.ts
export default {
extends: null,
use: MinimalLayout
} |
After digging through the source code of // src/pages/+config.ts
export default {
Layout: DefaultLayout
};
// src/pages/login/+config.ts
export default {
inherits: {
Layout: false,
},
Layout: LoginLayout
};
// src/pages/article/seller-statistics/+config.ts
const AdminDefaults = {
inherits: {
Layout: false,
title: false
},
Layout: [AdminLayout, DefaultLayout]
};
export default {
extends: AdminDefaults
};
// src/pages/cart/checkout/+config.ts
import MinimalLayoutDefaults from 'pages/(minimal-layout)/defaults';
export default {
extends: MinimalLayoutDefaults,
Layout: CheckoutLayout
};
// src/pages/(minimal-layout)/+config.ts
export default {
inherits: {
Layout: false,
},
Layout: MinimalLayout
};
// src/pages/(minimal-layout)/defaults.ts
export default const MinimalLayoutDefaults = {
inherits: {
Layout: false
},
Layout: MinimalLayout
}; |
I am also interested in this inherited layout behavior. One thing that really caused some interesting behaviors is that my _errors/+Page.js file is also inheriting the default layout, which it shouldn't be. I had to basically move all of my base routes into a (app) folder to prevent errors from using the default layout. I get the entire Vike stack in a bit of a recursive trace because if something errors out in the default layout, it calls the error page, which calls the default layout with an error again. +1 for the inherits example above. I read over the initial suggestion and I'm not sure I quite understand the expected behavior with default/overrides option. It seems like it covers the needed scenarios, but it's not all that clear. I probably just need to mull it over. |
(I'll have a closer look at your proposal once I'm done with what I'm currently working on. ETA next week.) |
I really need this option. In my app, some subpages won't inherit the layout from the parent. |
@k9982874 For now, you can use a simple workaround: just define your own config setting for Layout rendering, which will not be cumulative.
You can then render
This approach allows you to define |
Basics
Add two new settings
default: boolean | string
andoverride: boolean | string
for controlling cumulative values:Groups
Feedback
If you want this, add a comment below elaborating on why you need this.
The text was updated successfully, but these errors were encountered: