Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Filter #621

Open
kaiquyricardo opened this issue Jan 24, 2024 · 2 comments
Open

Filter #621

kaiquyricardo opened this issue Jan 24, 2024 · 2 comments

Comments

@kaiquyricardo
Copy link

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();
}

}

`

@ch4ika
Copy link

ch4ika commented Jan 26, 2024

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

@ch4ika
Copy link

ch4ika commented Mar 14, 2024

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();
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: 📋 Backlog
Development

No branches or pull requests

2 participants