Current section
Files
Jump to
Current section
Files
lib/scales_cms_web/helpers/cms_directory.ex
defmodule ScalesCmsWeb.Helpers.CmsDirectory do
@moduledoc """
Helper functions for building CMS directory paths and URLs.
"""
use ScalesCmsWeb, :verified_routes
@doc """
Builds a filter path for the CMS directory listing with optional query parameters.
## Parameters
* `current_directory` - The current directory struct or nil for root
* `query` - Search query string
* `status` - Status filter ("published", "draft", or "")
* `sort_by` - Column to sort by ("created", "views", "status", or "")
* `sort_order` - Sort direction ("asc" or "desc")
* `page` - Current page number (optional)
* `per_page` - Items per page (optional)
## Examples
iex> build_filter_path(nil, "", "", "", "asc")
"/cms/directories"
iex> build_filter_path(nil, "search", "published", "created", "desc")
"/cms/directories?query=search&status=published&sort_by=created&sort_order=desc"
iex> build_filter_path(nil, "", "", "", "asc", 2, 20)
"/cms/directories?page=2&per_page=20"
"""
def build_filter_path(
current_directory,
query,
status,
sort_by,
sort_order,
page \\ nil,
per_page \\ nil
) do
base_path =
if current_directory != nil,
do: ~p"/cms/directories/#{current_directory.id}",
else: ~p"/cms/directories"
params =
%{}
|> maybe_add_param("query", query)
|> maybe_add_param("status", status)
|> maybe_add_param("sort_by", sort_by)
|> maybe_add_param("sort_order", if(sort_by != "", do: sort_order, else: ""))
|> maybe_add_pagination_param("page", page)
|> maybe_add_pagination_param("per_page", per_page)
if params == %{},
do: base_path,
else: base_path <> "?" <> URI.encode_query(params)
end
defp maybe_add_param(params, _key, ""), do: params
defp maybe_add_param(params, _key, nil), do: params
defp maybe_add_param(params, key, value), do: Map.put(params, key, value)
defp maybe_add_pagination_param(params, _key, nil), do: params
defp maybe_add_pagination_param(params, _key, 1), do: params
defp maybe_add_pagination_param(params, "per_page", 20), do: params
defp maybe_add_pagination_param(params, key, value), do: Map.put(params, key, value)
end