I am trying to use data-sly-repeat and need to define the max item to repeat. I though I could use the following HTL but if i replace the number with properties from the dialog (maxItems - sling:resourceType="granite/ui/components/coral/foundation/form/numberfield"), the component breaks with error Cannot get DefaultSlingScript: Operands are not of the same type: comparison is supported for Number types only.
<sly data-sly-repeat="${reference.items @ begin = 0, end = properties.maxItems}">
Is there a simple way of using only HTL to achieve this? I also tried ${properties.maxItems @ context='number'} but no luck
Thanks in advance.
Hi,
You can have Java or JS code to control the size of the list based on the value entered in cq:dialog
Ex:
Add the below JS code in a file
"use strict";
use(function () {
let n = properties.get("colNum", 0);
return {
columns: [...Array(100)] // empty, iterable, array of size n
};
});
<div
data-sly-use.config="<JS-file-name>"
data-sly-list="${config.columns}">
<div class="6u">
<h3>Accumsan</h3>
<ul class="alt">
<li><a href="#">Nascetur nunc varius</a></li>
<li><a href="#">Vis faucibus sed tempor</a></li>
<li><a href="#">Massa amet lobortis vel</a></li>
<li><a href="#">Nascetur nunc varius</a></li>
</ul>
</div>
</div>
Thanks. I have a Java sling modal that returns the items. I would like to use the HTL only if possible.
Views
Replies
Total Likes
you can try with list
e.g.
<ul data-sly-list.child="${currentPage.listChildren}">
<li data-sly-test="${childList.index <= 5}">${child.title}</li>
</ul>
Views
Replies
Total Likes
If the number is replace with the value from the cq dialog, it will return the same error
Cannot get DefaultSlingScript: Operands are not of the same type: comparison is supported for Number types only.
<sly data-sly-test.maxItems="${properties.maxItems @ context='number'}" />
<ul data-sly-list.ref="${reference.items}">
<li data-sly-test="${refList.index <= maxItems}"></li>
</ul>
Views
Replies
Total Likes
Is the type of you field maxItems String or Number ?
Views
Replies
Total Likes
In the cq:dialog, I am using sling:resourceType="granite/ui/components/coral/foundation/form/numberfield"
When check via crx/de, the property type is String.
Views
Replies
Total Likes
try to use typehint as Long for number field item.
NumberField — Granite UI 1.0 documentation
I also tried typeHint="Long" and in crx/de the property type is Long. But same error
Cannot get DefaultSlingScript: Operands are not of the same type: comparison is supported for Number types only
Views
Replies
Total Likes
ok then you have to go either with JS or Java to return filtered list based on number field.
May be its not written to support type conversions and works only within the indices of the collection.
htl-spec/SPECIFICATION.md at master · adobe/htl-spec · GitHub
data-sly-repeat
:
begin
- iteration begins at the item located at the specified index; first item of the collection has index 0step
- iteration will only process every step items of the collection, starting with the first oneend
- iteration ends at the item located at the specified index (inclusive)Go with Ravi/Arun's approach.
Views
Replies
Total Likes
"Operands are not of the same type: comparison is supported for Number types only."
means not the same type.
Make sure that properties.maxItems is of type of number
Views
Replies
Total Likes
Thanks all for the insightful suggestions.
Will go with Java/JS method since unable to achieve with HTL although the properties.maxItems type was changed to Long.
Views
Replies
Total Likes
fyi , [SLING-8217] Numeric operations can lead to Java code that doesn't compile - ASF JIRA
it is a bug in HTL/Sling
Views
Replies
Total Likes
Views
Likes
Replies