inventory-framework icon indicating copy to clipboard operation
inventory-framework copied to clipboard

Filter

Open kaiquyricardo opened this issue 1 year ago • 2 comments

I want to know if it is possible to make an item in the inventory that when clicked will filter what the page is receiving

private final EconomyPlugin plugin;

private State<Pagination> paginationState = lazyPaginationState(
        (context) -> transactions(context.getPlayer()),
        (context, item, index, transactions) ->
                item.withItem(new ItemBuilder(Material.SKULL_ITEM)
                .skullOwner(transactions.getAuthor())
                .name("§a" + transactions.getAuthor())
                .lore(
                        "",
                        " §aTransação #" + index,
                        " §fData: §7" + transactions.getDate(),
                        " §fValor: §7" + transactions.getType().getValue() +
                                NumberFormatter.format(transactions.getAmount()),
                        "")
                .build()
        )
);

@Override
public void onInit(@NotNull ViewConfigBuilder config) {
    config.title("Transações")
            .size(5)
            .layout(
                    "         ",
                    " OOOOOOO ",
                    " OOOOOOO ",
                    "         ",
                    "         "
            )
            .cancelOnClick()
            .cancelOnDrop()
            .cancelOnPickup()
            .cancelOnDrag();
}

@Override
public void onFirstRender(@NotNull RenderContext render) {
    final Pagination pagination = paginationState.get(render);

    render.slot(18, new ItemBuilder(Material.SKULL_ITEM)
                    .texture("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODU1MGI3Zjc0ZTllZDc2MzNhYTI3NGVhMzBjYzNkMmU4N2FiYjM2ZDRkMWY0Y2E2MDhjZDQ0NTkwY2NlMGIifX19")
                    .name("§aPágina anterior")
                    .build())
            .watch(paginationState)
            .displayIf(pagination::canBack)
            .onClick(pagination::back);

    render.slot(26, new ItemBuilder(Material.SKULL_ITEM)
                    .texture("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTYzMzlmZjJlNTM0MmJhMThiZGM0OGE5OWNjYTY1ZDEyM2NlNzgxZDg3ODI3MmY5ZDk2NGVhZDNiOGFkMzcwIn19fQ==")
                    .name("§aPróxima página")
                    .build())
            .watch(paginationState)
            .displayIf(pagination::canAdvance)
            .onClick(pagination::advance);

    render.slot(40, new ItemBuilder(Material.HOPPER)
            .name("§aFilter")
            .build()
    ).onClick(click -> {
        /// FILTER WHAT THE PAGINATION WILL RECEIVE
        /// FILTER WHAT THE PAGINATION WILL RECEIVE
        /// FILTER WHAT THE PAGINATION WILL RECEIVE
        /// FILTER WHAT THE PAGINATION WILL RECEIVE
        /// FILTER WHAT THE PAGINATION WILL RECEIVE

    });
}

public List<Transactions> transactions(Player player) {
    return plugin.getUserCache().getByUser(player.getName()).getTransactions();
}

}

`

kaiquyricardo avatar Jan 24 '24 00:01 kaiquyricardo

Unfortunately there is currently no way to filter paginations. But the whole thing can be viewed as a feature request.

ch4ika avatar Jan 26 '24 02:01 ch4ika

You can add your own filter to the pagination without any problems. You would then add a MutableState with your filter option and set it to the desired one when you click. And then force update your pagination again and again.

Example:

    private final MutableState<WarpSearch> search = mutableState(WarpSearch.MOST_VISITED);

    private State<Pagination> initialPaginationState() {
        return lazyPaginationState(context -> {
            WarpSearch search = this.search.get(context);
            WarpQuery query = new WarpQuery(search, warpManager.getWarps());
            return query.withStatus(WarpStatus.PUBLIC).asList();
        }, (context, builder, index, value) -> {
            builder.onRender(slot -> onRenderComponent(slot, value));
            builder.onClick(slot -> onClickWarp(slot, value));
        });
    }
    
    private void onClickSearch(SlotClickContext context) {
        WarpSearch search = this.search.get(context);
        this.search.set(WarpSearch.next(search), context);

        Pagination pagination = this.pagination.get(context);
        pagination.forceUpdate();

        context.update();
    }

ch4ika avatar Mar 14 '24 12:03 ch4ika