inventory-framework
inventory-framework copied to clipboard
Filter
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();
}
}
`
Unfortunately there is currently no way to filter paginations. But the whole thing can be viewed as a feature request.
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();
}