SQLpage icon indicating copy to clipboard operation
SQLpage copied to clipboard

"each_row" helper cannot contain calls to inline partials.

Open mesr opened this issue 9 months ago • 2 comments

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 avatar Mar 06 '25 15:03 mesr

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.

lovasoa avatar Mar 06 '25 16:03 lovasoa

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!

mesr avatar Mar 07 '25 10:03 mesr