Use List in Page class Play Framework

834 Views Asked by At

In play framework model we can return Page object to render in our view, but Page class can only call from finder object.

public static Page<DokumenKeluarFileModel> search(int page, int pageSize, String sortBy, String order, String filter){
    return find.where(filter)
            .orderBy(sortBy + " " + order)
            .findPagingList(pageSize)
            .setFetchAhead(false)
            .getPage(page);
}

My question here is Could i use this Page object without using finder object? because i have a list and i want to return it with pagination to the view. Thanks for the advice

3

There are 3 best solutions below

6
On BEST ANSWER

A pagination module exists, but it does not look up to date.

You could try my quick implementation of Page:

import java.util.List;
import java.util.NoSuchElementException;

public class ListBackedPage<T> implements Page<T> {

    private final List<T> list;
    private final int pageSize;
    private final int index;

    private ListBackedPage(List<T> list, int pageSize, int index) {
        this.list = list;
        this.pageSize = pageSize;
        this.index = index;
    }

    public static <U> Page<U> fromList(List<U> sourceList, int pageSize) {
        return new ListBackedPage(sourceList, pageSize, 0);
    }

    public String getDisplayXtoYofZ(String to, String of) {
        final int start = index * pageSize;
        return String.format("%d %s %d %s %d", 
            start, to, start + pageSize, of, getTotalRowCount());
    }

    public List<T> getList() {
        final int start = index * pageSize;
        final int end = Math.min(start + pageSize, getTotalRowCount());
        System.out.println(start + " - " + end);
        return list.subList(start, end);
    }

    public int getPageIndex() { return index; }

    public int getTotalPageCount() {
        return (int) Math.ceil(list.size() / (double) pageSize);
    }

    public int getTotalRowCount() { return list.size(); }

    public boolean hasNext() {
        return index >= 0 && index < getTotalPageCount() - 1;
    }

    public boolean hasPrev() {
        return index > 0 && index <= getTotalPageCount();
    }

    public Page<T> next() {
        if (! hasNext())
            throw new NoSuchElementException();
        return new ListBackedPage(list, pageSize, index + 1);
    }

    public Page<T> prev() {
        if (! hasPrev())
            throw new NoSuchElementException();
        return new ListBackedPage(list, pageSize, index - 1);
    }

    public String toString() {
        return String.format("Page %d/%d", index + 1, getTotalPageCount());
    }

}

To create a page:

List<String> list = java.util.Arrays.asList("a", "b", "c");
Page<String> page = ListBackedPage.fromList(list, 2);
3
On

this is my routes

GET     /pencarian                      controllers.Pencarian.index()
POST    /pencarian/search               controllers.Pencarian.search(page:Int ?=0)

My Controllers

 public static Result search(int page){
    int maxPage = 3;
    Form<PencarianBean> filledform = pencarianForm.bindFromRequest();
    String filter = "";
    String debiturId="";
    String condition="";
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

    if(!filledform.get().getDebitur().isEmpty()){
        debiturId = DebiturModel.getDebiturId(filledform.get().getDebitur());
        filter = "debitur.cif = "+debiturId;
    }

    if(!filledform.get().getDokumen().isEmpty()){
            if (!filter.equals("")) {
                filter = filter + " and ";
            }
            filter = filter + "namaDokumen.document = \"" +filledform.get().getDokumen()+"\"";
    }

    if(!filledform.get().getNamaDokumen().isEmpty()){
        if (!filter.equals("")){
            filter = filter + " and ";
        }
        filter = filter + "namaDokumen.documentName = \""+filledform.get().getNamaDokumen()+"\"";
    }

    if (filledform.get().getTanggalDokumenStart() != null && filledform.get().getTanggalDokumenEnd() != null){

        if (!filter.equals("")){
            filter = filter + " and ";
        }
        filter = filter + "tanggalDokumen >= \""+format.format(filledform.get().getTanggalDokumenStart()) + "\" and tanggalDokumen <= \"" +format.format(filledform.get().getTanggalDokumenEnd())+"\"";
    }

    if (filledform.get().getJatuhTempoStart() != null && filledform.get().getJatuhTempoEnd() != null){
        if (!filter.equals("")){
            filter = filter + " and ";
        }
        filter = filter + "jatuhTempo >= \""+format.format(filledform.get().getJatuhTempoStart())+ "\" and jatuhTempo <= \"" +format.format(filledform.get().getJatuhTempoEnd())+"\"";
    }

    if(!filledform.get().getMutasi().isEmpty()){
        if (!filter.equals("")){
            filter = filter + " and ";
        }
        if(filledform.get().getMutasi().equals("masuk")){
            filter = filter + "available = true";
        }else{
            if (!filledform.get().getMutasi().equals("keluar")){
                condition = filledform.get().getMutasi();
            }
            filter = filter + "available = false";
        }

    }

    List<PencarianResultBean> pencarianList = getPencarian(DokumenMasukModel.getDokumen(filter, "debitur.debitur", "asc"),condition);

    Page<PencarianResultBean> pencarianPage = ListBackedPage.fromList(pencarianList,maxPage);

    return ok(pencarian.html.pencarianResult.render(pencarianPage,filledform,page));

}

I am sorry, i still cant post picture yet. I will use page in /pencarian/search. after clicked next, url will be /pencarian/Page 2/1

0
On

This is my view

@(documentList: com.avaje.ebean.Page[PencarianResultBean], pencarianForm: Form[PencarianBean])
@import helper._


@body("Pencarian"){
<div class="container">
<div class="row clearfix">
    <div class="col-md-12 column">
        <table class="table table-hover" style="width: 800px;">
            <thead>
            <tr>
                <th>Debitur</th>
                <th>Nama Dokumen</th>
                <th>Nomor</th>
                <th>Tanggal Dokumen</th>
                <th>Jatuh Tempo</th>
                <th>Pemilik</th>
                <th>Lokasi</th>
                <th>Luas</th>
                <th>Nilai</th>
                <th>Asli/Copy</th>
                <th>Ada/Tidak</th>
                <th>Nomor Bast</th>
                <th>Tanggal</th>
                <th>Keterangan</th>
            </tr>
            </thead>
            <tbody>
            @for(doc <- documentList.getList){
            <tr>
                <td>
                    @doc.getDebitur
                </td>
                <td>
                    @doc.getNamaDokumen
                </td>
                <td>
                    @doc.getNomor
                </td>
                <td>
                    @if(doc.getTanggalDokumen == null){
                    <em>-</em>
                    }else{
                    @doc.getTanggalDokumen.format("dd/MM/yyyy")
                    }
                </td>
                <td>
                    @if(doc.getJatuhTempo == null){
                    <em>-</em>
                    }else{
                    @doc.getJatuhTempo.format("dd/MM/yyyy")
                    }
                </td>
                <td>
                    @doc.getPemilik
                </td>
                <td>
                    @doc.getLokasi
                </td>
                <td>
                    <p class="autonumber">@doc.getLuas</p>
                </td>
                <td>
                    <p class="autonumber">@doc.getNilai</p>
                </td>
                <td>
                    @if(doc.getAsli == true){
                    A
                    }else{
                    C
                    }
                </td>
                <td>
                    @if(doc.getAvailable == true){
                    A
                    }else{
                    T
                    }
                </td>
                <td>
                    @doc.getNomorBast
                </td>
                <td>
                    @if(doc.getTanggal == null){
                    <em>-</em>
                    }else{
                    @doc.getTanggal.format("dd/MM/yyyy")
                    }
                </td>
                <td>
                    @doc.getKeterangan
                </td>
            </tr>
            }
            </tbody>
        </table>
    </div>
</div>

<ul class="pagination">
    @if(documentList.hasPrev) {
    <li class="prev">
        <a href="@documentList.prev">&larr; Previous</a>
    </li>
    } else {
    <li class="prev disabled">
        <a>&larr; Previous</a>
    </li>
    }
    <li class="current">
        <a>Displaying @documentList.getDisplayXtoYofZ(" to "," of ")</a>
    </li>
    @if(documentList.hasNext) {
    <li class="next">
        <a href="@documentList.next">Next &rarr;</a>
    </li>
    } else {
    <li class="next disabled">
        <a>Next &rarr;</a>
    </li>
    }
</ul>

@form(routes.Pencarian.index()){
<input type="hidden" name ="mutasi" value="@pencarianForm("mutasi").value">
<input type="hidden" name ="debitur" value="@pencarianForm("debitur").value">
<input type="hidden" name ="dokumen" value="@pencarianForm("dokumen").value">
<input type="hidden" name ="namaDokumen" value="@pencarianForm("namaDokumen").value">
<input type="hidden" name ="tanggalDokumenStart" value="@pencarianForm("tanggalDokumenStart").value">
<input type="hidden" name ="tanggalDokumenEnd" value="@pencarianForm("tanggalDokumenEnd").value">
<input type="hidden" name ="jatuhTempoStart" value="@pencarianForm("jatuhTempoStart").value">
<input type="hidden" name ="jatuhTempoEnd" value="@pencarianForm("jatuhTempoEnd").value">

<div class="form-group">
    <button type="submit" class="btn btn-info cusbutton">Cancel</button>
</div>
}

}