Search code examples
htmlgrailsgsp

need set of 8 X n.. data using <g:each> <g:if> <g:set>


Kindly help me to define in GSP page displaying.

if i have not fixed in set like some time i have 3 or 8 or 15 or 17 and i have the structure like if FOR 5 sets

<LI>
<DIV class= A>
<DIV class=B>
<DIV class=row>
    <DIV class=col>1</DIV>
    <DIV class=col>2</DIV>
    <DIV class=col>3</DIV>
    <DIV class=col>4</DIV>
</DIV>
<DIV class=row>
    <DIV class=col>5</DIV>
</DIV>
</DIV>
</DIV>
</LI>

if it's 15 set then

<LI>
<DIV class= A>
<DIV class=B>
<DIV class=row>
    <DIV class=col>1</DIV>
    <DIV class=col>2</DIV>
    <DIV class=col>3</DIV>
    <DIV class=col>4</DIV>
</DIV>
<DIV class=row>
    <DIV class=col>5</DIV>
    <DIV class=col>6</DIV>
    <DIV class=col>7</DIV>
    <DIV class=col>8</DIV>
</DIV>
</DIV>
</DIV>
</LI>
<LI>
<DIV class= A>
<DIV class=B>
<DIV class=row>
    <DIV class=col>9</DIV>
    <DIV class=col>10</DIV>
    <DIV class=col>11</DIV>
    <DIV class=col>12</DIV>
</DIV>
<DIV class=row>
    <DIV class=col>13</DIV>
    <DIV class=col>14</DIV>
    <DIV class=col>15</DIV>
</DIV>
</DIV>
</DIV>
</LI>

what i am trying to do is

<g:set var="dataSetTotal" value="${15 }" />
          <g:set var="setDataRange" value="${8 }" />
          <g:set var="liDivCount" value="${(int)((dataSetTotal/setDataRange)+1)}" />
          ${setDataRange}
          ${liDivCount }
          <g:each in="${1..liDivCount}">
          ${it} //Run which need li section
                <g:each in="${1..setDataRange}" var="inside" status="j">
                 print ${j }
                 <g:if test="${j % 4 ==0 }">
                    print row
                 </g:if>
                </g:each>
          </g:each>

Solution

  • Groovy adds a handy collate() method on Lists, which can be used as follows:

    <g:set var="itemsPerLi" value="${8}" />
    <g:set var="itemsPerRow" value="${4}" />
    <g:set var="myList" value="${[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]}" />
    
    <g:each in="${myList.collate(itemsPerLi)}" var="a">
    <LI>
      <DIV class="A">
        <DIV class="B">
          <g:each in="${a.collate(itemsPerRow)}" var="row">
            <DIV class="row">
              <g:each in="${row}"><DIV class="col">${it}</div></g:each>
            </DIV>
          </g:each>
        </DIV>
      </DIV>
    </LI>
    </g:each>