| Copyright | (c) digitally induced GmbH 2021 |
|---|---|
| Safe Haskell | None |
| Language | GHC2021 |
IHP.Pagination.ControllerFunctions
Description
Synopsis
- paginate :: forall controller (table :: Symbol). (?context :: ControllerContext, ?modelContext :: ModelContext, ?theAction :: controller, ?request :: Request, KnownSymbol table) => QueryBuilder table -> IO (QueryBuilder table, Pagination)
- paginateWithOptions :: forall controller (table :: Symbol). (?context :: ControllerContext, ?modelContext :: ModelContext, ?theAction :: controller, ?request :: Request, KnownSymbol table) => Options -> QueryBuilder table -> IO (QueryBuilder table, Pagination)
- filterList :: forall (name :: Symbol) (table :: Symbol) model. (?context :: ControllerContext, ?request :: Request, KnownSymbol name, HasField name model Text, model ~ GetModelByTableName table, KnownSymbol table, Table model) => Proxy name -> QueryBuilder table -> QueryBuilder table
- defaultPaginationOptions :: Options
- paginatedSqlQuery :: (FromRowHasql model, ToSnippetParams parameters, ?context :: ControllerContext, ?modelContext :: ModelContext, ?request :: Request) => Text -> parameters -> IO ([model], Pagination)
- paginatedSqlQueryWithOptions :: (FromRowHasql model, ToSnippetParams parameters, ?context :: ControllerContext, ?modelContext :: ModelContext, ?request :: Request) => Options -> Text -> parameters -> IO ([model], Pagination)
Documentation
paginate :: forall controller (table :: Symbol). (?context :: ControllerContext, ?modelContext :: ModelContext, ?theAction :: controller, ?request :: Request, KnownSymbol table) => QueryBuilder table -> IO (QueryBuilder table, Pagination) Source #
Paginate a query, with the following default options:
- Maximum items per page: 50. Each page will show at most 50 items.
- Selector window size: 5. The selector will show the current page, and 5 pages before and after it, if they exist.
This function should be used inside your controller action. It will do two things:
- Using the
page(current page number to display) andmaxItems(which overrides the set maximum items per page) request parameters, this applies the the needed limit and offset to display the correct page. For instance, page 3 with a maxItems of 50 would produce a limit of 50 and an offset of 100 to display results 100 through 150. - Returns a
Paginationstate which should be passed through to your view and then, in turn,renderPagination.
Example:
action UsersAction = do
(userQ, pagination) <- query @User
|> orderBy #email
|> paginate
user <- userQ |> fetch
render IndexView { .. }paginateWithOptions :: forall controller (table :: Symbol). (?context :: ControllerContext, ?modelContext :: ModelContext, ?theAction :: controller, ?request :: Request, KnownSymbol table) => Options -> QueryBuilder table -> IO (QueryBuilder table, Pagination) Source #
Paginate with ability to override the default options for maximum items per page and selector window size.
This function should be used inside your controller action. It will do two things:
- Using the
page(current page number to display) andmaxItems(which overrides the set maximum items per page) request parameters, this applies the the needed limit and offset to display the correct page. For instance, page 3 with a maxItems of 50 would produce a limit of 50 and an offset of 100 to display results 100 through 150. - Returns a
Paginationstate which should be passed through to your view and then, in turn,renderPagination.
Example:
action UsersAction = do
(userQ, pagination) <- query @User
|> orderBy #email
|> paginateWithOptions
(defaultPaginationOptions
|> set #maxItems 10)
user <- userQ |> fetch
render IndexView { .. }filterList :: forall (name :: Symbol) (table :: Symbol) model. (?context :: ControllerContext, ?request :: Request, KnownSymbol name, HasField name model Text, model ~ GetModelByTableName table, KnownSymbol table, Table model) => Proxy name -> QueryBuilder table -> QueryBuilder table Source #
Reading from the filter query parameter, filters a query according to the string entered in the
filter box by the user (if any), on a given text-based field. Will return any results containing the
string in a case-insensitive fashion.
Example:
action UsersAction = do
(userQ, pagination) <- query @User
|> orderBy #email
|> paginate
|> filterList #email
user <- userQ |> fetch
render IndexView { .. }defaultPaginationOptions :: Options Source #
Default options for a pagination. Can be passed into paginateOptions. The defaults are as follows:
- Maximum items per page: 50. Each page will show at most 50 items.
- Selector window size: 5. The selector will show the current page, and up to 5 pages before and after it, if they exist.
paginatedSqlQuery :: (FromRowHasql model, ToSnippetParams parameters, ?context :: ControllerContext, ?modelContext :: ModelContext, ?request :: Request) => Text -> parameters -> IO ([model], Pagination) Source #
Runs a raw sql query and adds pagination to it.
By default, the pagination uses the following options: 1. Maximum items per page: 50. Each page will show at most 50 items. 2. Selector window size: 5. The selector will show the current page, and 5 pages before and after it, if they exist.
This function should be used inside your controller action. It will do three things:
- Using the
page(current page number to display) andmaxItems(which overrides the set maximum items per page) request parameters, this applies the the needed limit and offset to display the correct page. For instance, page 3 with a maxItems of 50 would produce a limit of 50 and an offset of 100 to display results 100 through 150. - Returns a
Paginationstate which should be passed through to your view and then, in turn,renderPagination. - Actually run the query and return the result.
Example:
(users, pagination) <- paginatedSqlQuery "SELECT id, firstname, lastname FROM users" ()
Take a look at IHP.QueryBuilder for a typesafe approach on building simple queries.
- AutoRefresh:* When using
paginatedSqlQuerywith AutoRefresh, you need to usetrackTableReadto let AutoRefresh know that you have accessed a certain table. Otherwise AutoRefresh will not watch table of your custom sql query.
paginatedSqlQueryWithOptions :: (FromRowHasql model, ToSnippetParams parameters, ?context :: ControllerContext, ?modelContext :: ModelContext, ?request :: Request) => Options -> Text -> parameters -> IO ([model], Pagination) Source #
Runs a raw sql query and adds pagination to it.
This function accepts the same Options as paginateWithOptions, but otherwise behaves like paginatedSqlQuery.
Example:
(users, pagination) <- paginatedSqlQueryWithOptions
(defaultPaginationOptions |> set #maxItems 10)
"SELECT id, firstname, lastname FROM users"
()Take a look at IHP.QueryBuilder for a typesafe approach on building simple queries.
- AutoRefresh:* When using
paginatedSqlQuerywith AutoRefresh, you need to usetrackTableReadto let AutoRefresh know that you have accessed a certain table. Otherwise AutoRefresh will not watch table of your custom sql query.