Skip to content

"each_row" helper cannot contain calls to inline partials. #846

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

Open
mesr opened this issue Mar 6, 2025 · 2 comments
Open

"each_row" helper cannot contain calls to inline partials. #846

mesr opened this issue Mar 6, 2025 · 2 comments
Labels
bug Something isn't working

Comments

@mesr
Copy link

mesr commented Mar 6, 2025

Introduction

"each_row" helper cannot contain calls to inline partials.

To Reproduce

{{#*inline "item" }}
    <li>{{ this }}</li>
{{/inline}}
<ul>
{{#each_row }}
    {{> item }}
{{/each_row }}
</ul>
select
    'foo' as component;
select
    'a' as item;
select
    'b' as item;
select
    'c' as item;

Actual behavior

After following these steps, this error message shows up on the web page:

Partial not found item

Version information

  • OS: Linux Debian 11
  • PostgreSQL 17
  • SQLPage 0.33.1
@mesr mesr added the bug Something isn't working label Mar 6, 2025
@lovasoa
Copy link
Collaborator

lovasoa commented Mar 6, 2025

The issue you're experiencing with inline partials not working inside each_row helpers is due to how SQLPage processes templates internally.

In SQLPage the template rendering process involves splitting templates into three parts:

pub struct SplitTemplate {
    pub before_list: Template,
    pub list_content: Template,
    pub after_list: Template,
}

When SQLPage encounters an each_row helper, it splits the template at that point using the split_template function. This function extracts the content inside the each_row block into a separate template (list_content), with everything before it going into before_list and everything after into after_list.

The problem occurs because inline partials defined with {{#*inline "name"}}...{{/inline}} are registered in the Handlebars registry during the initial template parsing. However, when the template is split, these inline partial definitions remain in the before_list section, but the list_content template (which contains your each_row content) becomes a separate template context that doesn't have access to those inline partials.

In the render_item method of SplitTemplateRenderer, when it tries to render each row, it's using the isolated list_content template which can't see the inline partials defined in the parent template.

This is why you're seeing the "Partial not found item" error - the {{> item }} reference inside your each_row block is looking for a partial that isn't accessible from that context.

Possible workarounds:

  1. Use direct HTML in the each_row block instead of a partial
  2. Define the partial inside #each_row

This is a limitation of how SQLPage processes templates to support its streaming row-by-row rendering model, which is different from standard Handlebars processing.

@mesr
Copy link
Author

mesr commented Mar 7, 2025

Thank you @lovasoa for this detailed answer. This is very useful information indeed. Workaround 1 is not applicable to our use case, as it would lead to a lot of hard-to-maintain duplication of code. Workaround 2, even though not ideal, is a workable solution. So, thanks again and keep up the good work!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants